Получение OOM при использовании GATE на большом наборе данных
Я новичок в НЛП и использую GATE для него. Я получаю OOM Exception, если я запускаю свой код для большого набора данных (содержащего 7K+ записей). Ниже приведен код, где происходит исключение.
/**
* Run ANNIE
*
* @param controller
* @throws GateException
*/
public void execute(SerialAnalyserController controller)
throws GateException {
TestLogger.info("Running ANNIE...");
controller.execute(); /**** GateProcessor.java:217 ***/
// controller.cleanup();
TestLogger.info("...ANNIE complete");
}
Вот журнал:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.HashMap.addEntry(Unknown Source)
at java.util.HashMap.put(Unknown Source)
at java.util.HashMap.putAll(Unknown Source)
at gate.annotation.AnnotationSetImpl.<init>(AnnotationSetImpl.java:111)
at gate.jape.SinglePhaseTransducer.attemptAdvance(SinglePhaseTransducer.java:448)
at gate.jape.SinglePhaseTransducer.transduce(SinglePhaseTransducer.java:287)
at gate.jape.MultiPhaseTransducer.transduce(MultiPhaseTransducer.java:168)
at gate.jape.Batch.transduce(Batch.java:352)
at gate.creole.Transducer.execute(Transducer.java:116)
at gate.creole.SerialController.runComponent(SerialController.java:177)
at gate.creole.SerialController.executeImpl(SerialController.java:136)
at gate.creole.SerialAnalyserController.executeImpl(SerialAnalyserController.java:67)
at gate.creole.AbstractController.execute(AbstractController.java:42)
at in.co.test.GateProcessor.execute(GateProcessor.java:217)
Я хотел бы знать, что именно происходит с функцией execute и как ее можно решить. Благодарю.
1 ответ
Обработка больших (или многих) документов в GATE может потребовать много памяти, GATE требуется много места для хранения аннотаций. С другой стороны, различные ресурсы обработки также требуют большого объема памяти: газетчики, тегеры на основе статистических моделей и т. Д.
Хитрость в GUI разработчика Gate заключается в том, чтобы хранить совокупность документов в хранилище данных, затем загружать только совокупность и запускать конвейер. GATE достаточно умен, чтобы загружать по одному документу за раз, обрабатывать его, затем сохранять и закрывать перед открытием следующего. (Вы можете сначала сохранить пустой корпус в хранилище данных, а затем "заполнить" его из папки, это снова загрузит документы один за другим, не тратя впустую память.)
Это именно то, что вы должны сделать в своем коде, открыть документ, обработать, сохранить и закрыть перед открытием следующего. Если у вас есть один большой документ, вы должны разделить его (таким образом, чтобы это не повлияло на производительность ваших аннотаций).
Вот пример кода из модуля "Advanced GATE Embedded":
// for each piece of text:
Document doc = (Document)Factory.createResource("gate.corpora.DocumentImpl",
Utils.featureMap("stringContent", text, "mimeType", mime));
Corpus corpus = Factory.newCorpus("webapp corpus");
try {
corpus.add(doc);
application.execute();
...
finally {
corpus.clear();
Factory.deleteResource(doc);
}