Как я могу загрузить модель в 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? Заранее спасибо.
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 принимать правильные решения о том, когда оставлять данные в памяти и когда записывать их на диск.