2016-04-05 2 views
2

Я пытаюсь извлечь информацию из нескольких файлов с помощью инструмента OpenIE из Stanford CoreNLP, он выдает ошибку из памяти, когда несколько файлов передаются на вход, вместо этого всего одного.Stanford NLP - OpenIE out of memory при обработке списка файлов

All files have been queued; awaiting termination... 
java.lang.OutOfMemoryError: GC overhead limit exceeded 
at edu.stanford.nlp.graph.DirectedMultiGraph.outgoingEdgeIterator(DirectedMultiGraph.java:508) 
at edu.stanford.nlp.semgraph.SemanticGraph.outgoingEdgeIterator(SemanticGraph.java:165) 
at edu.stanford.nlp.semgraph.semgrex.GraphRelation$GOVERNER$1.advance(GraphRelation.java:267) 
at edu.stanford.nlp.semgraph.semgrex.GraphRelation$SearchNodeIterator.initialize(GraphRelation.java:1102) 
at edu.stanford.nlp.semgraph.semgrex.GraphRelation$SearchNodeIterator.<init>(GraphRelation.java:1083) 
at edu.stanford.nlp.semgraph.semgrex.GraphRelation$GOVERNER$1.<init>(GraphRelation.java:257) 
at edu.stanford.nlp.semgraph.semgrex.GraphRelation$GOVERNER.searchNodeIterator(GraphRelation.java:257) 
at edu.stanford.nlp.semgraph.semgrex.NodePattern$NodeMatcher.resetChildIter(NodePattern.java:320) 
at edu.stanford.nlp.semgraph.semgrex.CoordinationPattern$CoordinationMatcher.matches(CoordinationPattern.java:211) 
at edu.stanford.nlp.semgraph.semgrex.NodePattern$NodeMatcher.matchChild(NodePattern.java:514) 
at edu.stanford.nlp.semgraph.semgrex.NodePattern$NodeMatcher.matches(NodePattern.java:542) 
at edu.stanford.nlp.naturalli.RelationTripleSegmenter.segmentVerb(RelationTripleSegmenter.java:541) 
at edu.stanford.nlp.naturalli.RelationTripleSegmenter.segment(RelationTripleSegmenter.java:850) 
at edu.stanford.nlp.naturalli.OpenIE.relationInFragment(OpenIE.java:354) 
at edu.stanford.nlp.naturalli.OpenIE.lambda$relationsInFragments$2(OpenIE.java:366) 
at edu.stanford.nlp.naturalli.OpenIE$$Lambda$76/1438896944.apply(Unknown Source) 
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) 
at java.util.HashMap$KeySpliterator.forEachRemaining(HashMap.java:1540) 
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481) 
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) 
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708) 
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) 
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499) 
at edu.stanford.nlp.naturalli.OpenIE.relationsInFragments(OpenIE.java:366) 
at edu.stanford.nlp.naturalli.OpenIE.annotateSentence(OpenIE.java:486) 
at edu.stanford.nlp.naturalli.OpenIE.lambda$annotate$3(OpenIE.java:554) 
at edu.stanford.nlp.naturalli.OpenIE$$Lambda$25/606198361.accept(Unknown Source) 
at java.util.ArrayList.forEach(ArrayList.java:1249) 
at edu.stanford.nlp.naturalli.OpenIE.annotate(OpenIE.java:554) 
at edu.stanford.nlp.pipeline.AnnotationPipeline.annotate(AnnotationPipeline.java:71) 
at edu.stanford.nlp.pipeline.StanfordCoreNLP.annotate(StanfordCoreNLP.java:499) 
at edu.stanford.nlp.naturalli.OpenIE.processDocument(OpenIE.java:630) 
DONE processing files. 1 exceptions encountered. 

я передавать файлы с помощью ввода с помощью этого вызова:

java -mx3g -cp stanford-corenlp-3.6.0.jar:stanford-corenlp-3.6.0-models.jar:CoreNLP-to-HTML.xsl:slf4j-api.jar:slf4j-simple.jar edu.stanford.nlp.naturalli.OpenIE file1 file2 file3 etc. 

Я попытался увеличения памяти с -mx3g и другими вариантами, и хотя количество обработанных файлов увеличивается, это не так много (от 5 до 7, например,). Каждый файл индивидуально обрабатывается правильно, поэтому я исключаю файл с большими предложениями или несколькими строками.

Есть ли опция, которую я не рассматриваю, какой-либо флаг OpenIE или Java, что я могу использовать, чтобы заставить дамп выводить, очищать или собирать мусор между каждым обрабатываемым файлом?

Спасибо заранее

+0

код для вызова пожалуйста – Woot4Moo

+1

Насколько велики вы обработки файлов (например, словами)? Сколько потоков имеет ваш компьютер? Одна вещь, которую вы можете попробовать, - установить «-threads 1» и отключить параллелизм при обработке документов. Это может решить проблему, если она загружает сразу несколько крупных документов. –

+0

@ Woot4Moo Я вызываю openIE непосредственно из оболочки, используя java-вызов, который я там помещаю, без изменения исходного кода, но спасибо в любом случае. – smothP

ответ

1

Из приведенных выше замечаний: Я подозреваю, что это проблема с слишком много параллельности и слишком мало памяти. OpenIE - голодная головоломка, особенно с длинными предложениями, и поэтому одновременное выполнение множества файлов может занимать справедливое количество памяти.

Легкое исправление заключается в том, чтобы заставить программу запускать однопоточную, установив флаг -threads 1. Если возможно, увеличение памяти также должно помочь.

+0

Еще раз спасибо! Моя машина имеет только 4 ГБ, поэтому я только пытался до 3Gb памяти. Я попытаюсь получить доступ к машине с большей памятью, чтобы проверить ее, но это решение идеально. – smothP

3

Выполнить эту команду, чтобы получить отдельную аннотацию на файл (образец-файла list.txt должен быть один файл в каждой строке)

java -Xmx4g -cp "stanford-corenlp-full-2015-12-09/*" edu.stanford.nlp.pipeline.StanfordCoreNLP -annotators tokenize,ssplit,pos,lemma,ner,depparse,natlog,openie -filelist sample-file-list.txt -outputDirectory output_dir -outputFormat text 
+1

Примечание: я просто исправил эту команду, так как в оригинале я использовал файл свойств на своей локальной машине! – StanfordNLPHelp

+1

Также есть множество выходных форматов (json, xml). Мне просто нравится использовать текст для удобства чтения, но, вероятно, он плохо подходит для перехода к следующему шагу в конвейере. – StanfordNLPHelp

+1

Обратите внимание, что это сбрасывает много дополнительного материала вместе с OpenIE; т. е. все остальные аннотации CoreNLP. –