首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带Mallet CRF分类器的OutOfMemoryError

带Mallet CRF分类器的OutOfMemoryError
EN

Stack Overflow用户
提问于 2015-11-20 01:55:03
回答 1查看 188关注 0票数 1

使用OutOfMemoryError时,分类器经常失败。请提个建议。

我们有UIMA管道,它调用5个模型jars(基于mallet CRF),每个大约30MB。-Xms设置为2G,-Xmx设置为4G。

在设置堆空间方面有什么指导原则/基准标记吗?如果有关于多线程环境的任何指南,请指出。

我确实尝试了应用补丁https://code.google.com/p/cleartk/issues/detail?id=408,但这并没有解决问题。

堆转储显示,42%的堆大小是char[],15%是String。

代码语言:javascript
复制
java.lang.OutOfMemoryError: Java heap space
    at cc.mallet.types.IndexedSparseVector.setIndex2Location(IndexedSparseVector.java:109)
    at cc.mallet.types.IndexedSparseVector.dotProduct(IndexedSparseVector.java:157)
    at cc.mallet.fst.CRF$TransitionIterator.<init>(CRF.java:1856)
    at cc.mallet.fst.CRF$TransitionIterator.<init>(CRF.java:1835)
    at cc.mallet.fst.CRF$State.transitionIterator(CRF.java:1776)
    at cc.mallet.fst.MaxLatticeDefault.<init>(MaxLatticeDefault.java:252)
    at cc.mallet.fst.MaxLatticeDefault.<init>(MaxLatticeDefault.java:197)
    at cc.mallet.fst.MaxLatticeDefault$Factory.newMaxLattice(MaxLatticeDefault.java:494)
    at cc.mallet.fst.MaxLatticeFactory.newMaxLattice(MaxLatticeFactory.java:11)
    at cc.mallet.fst.Transducer.transduce(Transducer.java:124)
    at org.cleartk.ml.mallet.MalletCrfStringOutcomeClassifier.classify(MalletCrfStringOutcomeClassifier.java:90)

基于MalletCrfStringOutcomeDataWriter创建模型。

代码语言:javascript
复制
AnalysisEngineFactory.createEngineDescription(DataChunkAnnotator.class,
        CleartkSequenceAnnotator.PARAM_IS_TRAINING, true, DirectoryDataWriterFactory.PARAM_OUTPUT_DIRECTORY,
        options.getModelsDirectory(), DefaultSequenceDataWriterFactory.PARAM_DATA_WRITER_CLASS_NAME, MalletCrfStringOutcomeDataWriter.class)

注释器代码如下所示。

代码语言:javascript
复制
if (this.isTraining()) {
        List<DataAnnotation> namedEntityMentions = JCasUtil.selectCovered(jCas, DataAannotation.class, sentence);
        List<String> outcomes = this.chunking.createOutcomes(jCas, tokens, namedEntityMentions);
        this.dataWriter.write(Instances.toInstances(outcomes, featureLists));
      } else {
        List<String> outcomes = this.classifier.classify(featureLists);
        this.chunking.createChunks(jCas, tokens, outcomes);
      }

谢谢

EN

回答 1

Stack Overflow用户

发布于 2015-11-20 02:06:38

您可以尝试执行以下操作:

  1. 增加Xmx
  2. 深入分析堆:所有字符串都由char[]备份-所以知道像42%和15%这样的数字是没有帮助的-您应该调查程序的哪个部分分配了这些字符串。
  3. ,因为它看起来像是在一行中触发的错误:

List<String> outcomes = this.classifier.classify(featureLists);

你可以从这里开始:试着弄清楚featureLists中有什么,它的大小等等,看看classify方法做了什么,如果你能“帮助”它在内存方面变得更有效率。例如,减少String的使用,并将其替换为StringBuilderappend (仅举个例子)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33811026

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档