Получение OOM при использовании GATE на большом наборе данных

Я новичок в НЛП и использую для этого GATE. Я получаю исключение OOM, если запускаю свой код для большого набора данных (содержащего 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)

Я хотел бы знать, что именно происходит с функцией выполнения и как ее можно решить. Спасибо.


person Divya Motiwala    schedule 26.02.2013    source источник
comment
Как именно вы запускаете GATE? Какая точная команда? Я думаю, вы хорошо справитесь с Google Exception в потоке main java.lang.OutOfMemoryError: пространство кучи Java. Скорее всего, это общая проблема Java, а не проблема GATE.   -  person dmn    schedule 26.02.2013
comment
@dmn: я не мог понять, что именно вы имели в виду, запуская GATE? Я не использую его отдельно, но встроил GATE JAR в свой код и использую некоторые функции. Я погуглил об этом, и обычно большинство людей предпочитают -Xmx для увеличения размера кучи. Но есть ли другой способ?   -  person Divya Motiwala    schedule 27.02.2013
comment
Да все верно. Что происходит, когда вы увеличиваете размер кучи с помощью -Xmx?   -  person dmn    schedule 28.02.2013
comment
Размер моих 7K-записей составляет ~ 2,2 МБ. После увеличения размера кучи с помощью -Xmx он работает для размера файла до ~ 1,87 МБ, а затем снова дает сбой. Кроме того, в этом процессе он становится очень медленным. Я увеличил размер кучи до 512 МБ.   -  person Divya Motiwala    schedule 01.03.2013


Ответы (1)


Обработка больших (или многих) документов в GATE может потребовать много памяти, GATE требует много места для хранения аннотаций. С другой стороны, различные ресурсы обработки также требуют много памяти: географические справочники, теггеры на основе статистических моделей и т. д.

Уловка в графическом интерфейсе разработчика 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);
}
person Yasen    schedule 04.03.2013