我有一个问题问你:
我想在我的 Jena TDB TripleStore 上加载一个文件。
我的文件很大,大约80Mb,大约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 中?提前致谢。
你需要在启动时为 JVM 分配更多内存 https://stackoverflow.com/a/2294280/2528639。当你的垃圾收集太少时,进程将花费太多时间执行垃圾收集,并最终失败。
例如,通过以下方式启动具有 4 GB 内存的 JVM:
java -Xms4G -XmxG
如果您使用的是 Eclipse 等 IDE,您可以更改您的运行配置 https://stackoverflow.com/q/4175188/2528639以便应用程序也有额外的内存。
除此之外,唯一让我惊讶的是,您正在使用内存中模型进行实际加载操作,而实际上您可以使用 TDB 支持的模型。这可以帮助缓解内存问题,因为 TDB 会动态地将其索引移动到磁盘。
Change:
Dataset dataset = TDBFactory.createDataset(directory);
Model model = ModelFactory.createDefaultModel();
TDBLoader.loadModel(model, file );
dataset.addNamedModel("http://nameFile", model);
to this:
Dataset dataset = TDBFactory.createDataset(directory);
Model model = dataset.getNamedModel("http://nameFile");
TDBLoader.loadModel(model, file );
现在,您的系统取决于 TDB 就何时将数据保留在内存中以及何时将数据刷新到磁盘做出正确决策的能力。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)