2015-05-18 2 views
0

Я использую ARQ для запроса локальных файлов RDF. Команда, которую я использую следующий:Почему я получаю «превышение верхнего предела GC», когда я использую «arq» для запроса локальных файлов rdf.

./arq --data /home/datasets/a-m-00027.nt --results CSV --query myQuery.sparql 

myQuery.sparql содержит запрос:

PREFIX basekb:<http://rdf.basekb.com/ns/> 
PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#> 

SELECT ?x 
FROM </home/data/a-m-00027.nt> 
WHERE {?x rdf:type basekb:music.release} 
LIMIT 10 

Exception

Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded 
     at java.util.concurrent.CopyOnWriteArrayList.iterator(CopyOnWriteArrayList.java:959) 
     at com.hp.hpl.jena.graph.impl.SimpleEventManager.notifyAddTriple(SimpleEventManager.java:97) 
     at com.hp.hpl.jena.graph.impl.GraphBase.notifyAdd(GraphBase.java:124) 
     at com.hp.hpl.jena.graph.impl.GraphBase.add(GraphBase.java:203) 
     at com.hp.hpl.jena.sparql.core.DatasetGraphCollection.add(DatasetGraphCollection.java:43) 
     at com.hp.hpl.jena.sparql.core.DatasetGraphBase.add(DatasetGraphBase.java:82) 
     at org.apache.jena.riot.system.StreamRDFLib$ParserOutputDataset.triple(StreamRDFLib.java:206) 
     at org.apache.jena.riot.lang.LangNTriples.runParser(LangNTriples.java:61) 
     at org.apache.jena.riot.lang.LangBase.parse(LangBase.java:42) 
     at org.apache.jena.riot.RDFParserRegistry$ReaderRIOTLang.read(RDFParserRegistry.java:185) 
     at org.apache.jena.riot.RDFDataMgr.process(RDFDataMgr.java:906) 
     at org.apache.jena.riot.RDFDataMgr.parse(RDFDataMgr.java:687) 
     at org.apache.jena.riot.RDFDataMgr.read(RDFDataMgr.java:534) 
     at org.apache.jena.riot.RDFDataMgr.read(RDFDataMgr.java:501) 
     at org.apache.jena.riot.RDFDataMgr.read(RDFDataMgr.java:454) 
     at org.apache.jena.riot.RDFDataMgr.read(RDFDataMgr.java:432) 
     at org.apache.jena.riot.RDFDataMgr.read(RDFDataMgr.java:422) 
     at arq.cmdline.ModDatasetGeneral.addGraphs(ModDatasetGeneral.java:98) 
     at arq.cmdline.ModDatasetGeneral.createDataset(ModDatasetGeneral.java:87) 
     at arq.cmdline.ModDatasetGeneralAssembler.createDataset(ModDatasetGeneralAssembler.java:35) 
     at arq.cmdline.ModDataset.getDataset(ModDataset.java:34) 
     at arq.query.getDataset(query.java:176) 
     at arq.query.queryExec(query.java:198) 
     at arq.query.exec(query.java:159) 
     at arq.cmdline.CmdMain.mainMethod(CmdMain.java:102) 
     at arq.cmdline.CmdMain.mainRun(CmdMain.java:63) 
     at arq.cmdline.CmdMain.mainRun(CmdMain.java:50) 
     at arq.arq.main(arq.java:28) 

Факт пример

<http://rdf.basekb.com/ns/architecture.building_complex>  <http://www.w3.org/1999/02/22-rdf-syntax-ns#type>  <http://rdf.basekb.com/ns/type.type> 

ли весь файл загружается в память?

ответ

3

, потому что ты из памяти, как исключение говорит вам:

java.lang.OutOfMemoryError: GC overhead limit exceeded 

Хорошо возможно, что вы на самом деле не из памяти, но это только ваши настройки виртуальной машины Java, которая не будет превышать определенный объем памяти по умолчанию. Как описано в https://stackoverflow.com/a/21197787/1423333 попробуйте запустить

JVM_ARGS="-Xmx4096M" ./arq --data /home/datasets/a-m-00027.nt --results CSV --query myQuery.sparql 
+0

Я получил следующую ошибку: ** Непризнанная опция: --Xmx4G Ошибка: не удалось создать виртуальную машину Java. Ошибка: произошло фатальное исключение. Программа выйдет ** –

+0

извините, попробуйте с помощью --Xmx4096M вместо –

+0

То же самое я буду проверять, почему он не работает –

4

Is the whole file being loaded into memory?

Точно, вот ваш вопрос. Как вы сказали, вы можете столкнуться с кучей java и получить его.

Но в качестве альтернативы, или в тех случаях, когда вы просто не имеют достаточно памяти, попробуйте использовать TDB для хранения и индексировать файл, то запрос его:

$ tdbloader --loc my_tdb_store /home/datasets/a-m-00027.nt 
$ tdbquery --loc my_tdb_store --results CSV --query myQuery.sparql 

(Вы можете удалить хранилище, как только вы «закончено», это всего лишь каталог с именем my_tdb_store)

В качестве третьей альтернативы вы можете полностью пропустить sparql. Вы запрос просто находит первые десять вещей с типом basekb:music.release, которые вы можете найти так:

$ riot /home/datasets/a-m-00027.nt | \ 
    grep '<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://rdf.basekb.com/ns/music.release> .' | \ 
    cut -d ' ' -f 1 | \ 
    head -10 

, который использует минимальную память.

Смежные вопросы