Как я могу загрузить модель в TDB TripleStore

У меня вопрос к вам:

Я хочу загрузить файл в свой Jena TDB TripleStore. Мой файл очень большой, около 80Мб и около 700000 троек RDF. Когда я пытаюсь загрузить его, выполнение перестает работать или занимает очень много времени.

Я использую этот код, который я запускаю в веб-службе:

        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? Заранее спасибо.


person Musich87    schedule 15.09.2014    source источник


Ответы (1)


Вам нужно выделить больше памяти для вашей JVM при запуске. Когда у вас слишком мало, процесс будет тратить слишком много времени на сборку мусора и в конечном итоге потерпит неудачу.

Например, запустите JVM с 4 ГБ памяти:

java -Xms4G -XmxG

Если вы работаете в среде IDE, такой как Eclipse, вы можете изменить конфигурацию запуска, чтобы у приложения также была дополнительная память.

Помимо этого, единственное изменение, которое бросается в глаза, это то, что вы используете модель в памяти для фактической операции загрузки, когда вместо этого вы можете использовать модель, поддерживаемую 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 принимать правильные решения о том, когда оставлять данные в памяти, а когда сбрасывать их на диск.

person Rob Hall    schedule 15.09.2014
comment
Я думаю, что ответ - просто вторая часть - пропустите модель в памяти, и вам не нужно будет увеличивать выделение кучи. - person user205512; 15.09.2014
comment
Спасибо, Роб, я сделал это изменение, и теперь оно работает! - person Musich87; 15.09.2014
comment
Роб, это хорошее решение, но я заметил ошибку, о которой я сообщил в этом сообщении: stackoverflow.com/questions/25865560/ - person Musich87; 16.09.2014