【问题标题】:Getting OOM while using GATE on large data set在大型数据集上使用 GATE 时出现 OOM
【发布时间】:2013-02-11 12:02:08
【问题描述】:

我对 NLP 很陌生,并且正在使用 GATE。如果我为大型数据集(包含 7K+ 记录)运行我的代码,我会收到 OOM 异常。下面是发生异常的代码。

    /**
 * 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)

我想知道执行函数到底发生了什么以及如何解决它。谢谢。

【问题讨论】:

  • 你是如何启动 GATE 的,确切地说?确切的命令是什么?我认为你会很好地谷歌“线程“主”java.lang.OutOfMemoryError:Java堆空间中的异常”。这很可能是一般 Java 问题,而不是 GATE 问题。
  • @dmn :我不明白你启动 GATE 到底是什么意思?我不是以独立方式使用它,而是在我的代码中嵌入了 GATE JAR 并使用了一些功能。我对它进行了谷歌搜索,通常大多数人更喜欢 -Xmx 来增加堆大小。但是有没有其他办法?
  • 是的,没错。使用 -Xmx 增加堆大小时会发生什么?
  • 我的 7K 记录的大小约为 2.2 MB。使用 -Xmx 增加堆大小后,它运行的文件大小高达 ~1.87 MB,然后再次崩溃。此外,在这个过程中,它变得超级慢。我已将堆大小增加到 512 MB。

标签: java nlp gate


【解决方案1】:

在 GATE 中处理大型(或许多)文档可能需要大量内存,GATE 需要大量空间来存储注释。另一方面,各种处理资源也需要大量内存:地名词典、基于统计模型的标注器等。

Gate 开发人员 GUI 中的一个技巧是将文档语料库存储在数据存储中,然后仅加载语料库并运行管道。 GATE 足够聪明,可以一次加载一个文档,对其进行处理,然后在打开下一个文档之前保存并关闭它。 (您可以先将空语料库存储在数据存储中,然后从文件夹中“填充”它,这将再次一个一个地加载文档而不会浪费内存。)

这正是您应该在代码中执行的操作,打开文档、处理、保存和关闭,然后再打开下一个。如果您有一个大文档,则应将其拆分(以不破坏注释性能的方式)。

这是来自"Advanced GATE Embedded" module的代码示例:

// 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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-22
    • 2016-03-25
    • 2019-02-07
    • 2017-02-18
    • 2019-09-28
    • 1970-01-01
    • 2013-09-05
    • 2022-06-25
    相关资源
    最近更新 更多