2016-04-05 7 views
2

Ich versuche, Informationen aus mehreren Dateien mit dem OpenIE-Tool von Stanford CoreNLP zu extrahieren, es gibt einen Speichermangel Fehler, wenn mehrere Dateien an die Eingabe übergeben werden von nur einem.Stanford NLP - OpenIE nicht genügend Arbeitsspeicher bei der Verarbeitung der Liste der Dateien

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. 

passiere ich die Dateien durch Eingabe mit diesem Aufruf:

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. 

Ich habe versucht, den Speicher mit -mx3g und andere Varianten zu, und obwohl die Menge der verarbeiteten Dateien zunimmt, ist es nicht viel (von 5 bis 7, für zB.). Jede Datei wird einzeln korrekt verarbeitet, daher schließe ich eine Datei mit großen Sätzen oder vielen Zeilen aus.

Gibt es eine Option, die ich nicht in Erwägung ziehe, einige OpenIE oder Java-Flag, etwas, das ich verwenden kann, um einen Speicherauszug zu einer Ausgabe, einer Bereinigung oder Garbage Collection zwischen jeder Datei zu erzwingen?

Vielen Dank im Voraus

+0

Code aufzurufen, bitte – Woot4Moo

+1

Wie groß sind die Dateien Sie Verarbeitung erhalten (zB in Worten)? Wie viele Threads hat Ihr Computer? Eine Sache, die Sie versuchen können, ist, 'threads 1 'zu setzen und Parallelität bei der Verarbeitung der Dokumente zu deaktivieren. Dies könnte das Problem lösen, wenn es viele große Dokumente gleichzeitig lädt. –

+0

@ Woot4Moo Ich rufe openIE direkt von der Shell, mit dem Java-Aufruf ich dort, ohne den Quellcode zu ändern, aber trotzdem danke. – smothP

Antwort

1

Aus den obigen Ausführungen: Ich vermute, dass dies ein Problem mit zu viel Parallelität ist und zu wenig Speicher. OpenIE ist ein wenig speicherhungrig, besonders bei langen Sätzen, und daher kann das parallele Ausführen vieler Dateien viel Zeit in Anspruch nehmen.

Eine einfache Lösung besteht darin, das Programm zum Ausführen von Singlethread zu zwingen, indem Sie das Flag -threads 1 setzen. Wenn möglich, sollte auch die Speichererweiterung helfen.

+0

Nochmals vielen Dank! Meine Maschine hat nur 4 GB, also habe ich nur bis 3 GB Speicher versucht. Ich werde versuchen, Zugang zu einer Maschine mit mehr Speicher zu haben, nur um sie zu testen, aber diese Lösung ist perfekt. – smothP

3

Führen Sie diesen Befehl eine separate Annotation pro Datei (eine Datei pro Zeile Sample-Datei-list.txt sein sollte)

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

Hinweis: Ich habe diesen Befehl nur korrigiert, da ich im Originaldatensatz eine Eigenschaftendatei auf meinem lokalen Rechner verwendet habe! – StanfordNLPHelp

+1

Auch gibt es eine Vielzahl von outputFormats (json, xml) Ich mag nur Text für die Lesbarkeit, aber es ist wahrscheinlich schlecht für die Weitergabe an einen nächsten Schritt in einer Pipeline. – StanfordNLPHelp

+1

Beachten Sie, dass dies neben OpenIE eine Menge zusätzlicher Sachen abwerfen wird; d.h. alle anderen CoreNLP-Annotationen. –

Verwandte Themen