我有个问题要问你:
我想在我的Jena TDB TripleStore上加载一个文件。我的文件非常大,大约80 My和大约700000三倍的RDF。当我尝试加载它时,执行将停止工作或花费很长时间。
我正在使用在Web服务上运行的代码:
String file = "C:\\file.nt";
String directory;
directory = "C:\\tdb";
Dataset dataset = TDBFactory.createDataset(directory);
Model model = ModelFactory.createDefaultModel();
TDBLoader.loadModel(model, file );
dataset.addNamedModel("http://nameFile", model);
return model;有时,我会得到Java堆空间的错误:
Caused by: java.lang.OutOfMemoryError: Java heap space
at org.apache.jena.riot.tokens.TokenizerText.parseToken(TokenizerText.java:170)
at org.apache.jena.riot.tokens.TokenizerText.hasNext(TokenizerText.java:86)
at org.apache.jena.atlas.iterator.PeekIterator.fill(PeekIterator.java:50)
at org.apache.jena.atlas.iterator.PeekIterator.next(PeekIterator.java:92)
at org.apache.jena.riot.lang.LangEngine.nextToken(LangEngine.java:99)
at org.apache.jena.riot.lang.LangNTriples.parseOne(LangNTriples.java:67)
at org.apache.jena.riot.lang.LangNTriples.runParser(LangNTriples.java:54)
at org.apache.jena.riot.lang.LangBase.parse(LangBase.java:42)
at org.apache.jena.riot.RDFParserRegistry$ReaderRIOTFactoryImpl$1.read(RDFParserRegistry.java:142)
at org.apache.jena.riot.RDFDataMgr.process(RDFDataMgr.java:859)
at org.apache.jena.riot.RDFDataMgr.read(RDFDataMgr.java:255)
at org.apache.jena.riot.RDFDataMgr.read(RDFDataMgr.java:241)
at org.apache.jena.riot.adapters.RDFReaderRIOT_Web.read(RDFReaderRIOT_Web.java:96)
at com.hp.hpl.jena.rdf.model.impl.ModelCom.read(ModelCom.java:241)
at com.hp.hpl.jena.tdb.TDBLoader.loadAnything(TDBLoader.java:294)
at com.hp.hpl.jena.tdb.TDBLoader.loadModel(TDBLoader.java:125)
at com.hp.hpl.jena.tdb.TDBLoader.loadModel(TDBLoader.java:119)如何在模型Jena中加载该文件并将其保存在TDB中?提前谢谢。
发布于 2014-09-15 14:58:31
你需要allocate more memory for your JVM at statup。当您的资源太少时,该过程将花费太多的时间执行垃圾收集,最终将失败。
例如,使用4GB内存启动JVM:
java -Xms4G -XmxG如果您在像Eclipse这样的IDE中,您可以使用change your run configuration,以便应用程序也有额外的内存。
除此之外,唯一的改变就是在实际加载操作中使用内存中的模型,而实际上可以使用由TDB支持的模型。这有助于缓解内存问题,因为TDB动态地将其索引移动到磁盘。
更改:
Dataset dataset = TDBFactory.createDataset(directory);
Model model = ModelFactory.createDefaultModel();
TDBLoader.loadModel(model, file );
dataset.addNamedModel("http://nameFile", model);对此:
Dataset dataset = TDBFactory.createDataset(directory);
Model model = dataset.getNamedModel("http://nameFile");
TDBLoader.loadModel(model, file );现在,您的系统取决于TDB在何时将数据保存在内存中以及何时将其刷新到磁盘上的能力。
https://stackoverflow.com/questions/25850288
复制相似问题