Java 如何在TDB TripleStore中加载模型

Java 如何在TDB TripleStore中加载模型,java,web-services,rdf,jena,tdb,Java,Web Services,Rdf,Jena,Tdb,我有个问题要问你: 我想在我的Jena TDB TripleStore上加载一个文件。 我的文件非常大,大约80Mb,大约700000个三重RDF。当我尝试加载它时,执行停止工作或需要很长时间 我正在使用在Web服务上运行的代码: String file = "C:\\file.nt"; String directory; directory = "C:\\tdb"; Dataset dataset = TDBFactory.cre

我有个问题要问你:

我想在我的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中?提前谢谢。

你需要。当您的资源太少时,进程将花费太多时间执行垃圾收集,最终将失败

例如,使用4 GB内存启动JVM,方法是:

java -Xms4G -XmxG
如果您使用的是诸如Eclipse之类的IDE,那么您可以让应用程序也有额外的内存

除此之外,我看到的唯一变化是,在实际加载操作中使用内存中的模型,而实际上可以使用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在何时将数据保留在内存中以及何时将其刷新到磁盘上做出正确决定的能力。

我认为答案只是第二部分——跳过内存中的模型,您就不需要增加堆分配。感谢Rob,我已经完成了此修改,现在它可以工作了!Rob,这个解决方案很好,但我注意到我在这篇文章中报告的一个错误: