使用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。
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创建模型。
AnalysisEngineFactory.createEngineDescription(DataChunkAnnotator.class,
CleartkSequenceAnnotator.PARAM_IS_TRAINING, true, DirectoryDataWriterFactory.PARAM_OUTPUT_DIRECTORY,
options.getModelsDirectory(), DefaultSequenceDataWriterFactory.PARAM_DATA_WRITER_CLASS_NAME, MalletCrfStringOutcomeDataWriter.class)注释器代码如下所示。
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);
}谢谢
发布于 2015-11-20 02:06:38
您可以尝试执行以下操作:
char[]备份-所以知道像42%和15%这样的数字是没有帮助的-您应该调查程序的哪个部分分配了这些字符串。List<String> outcomes = this.classifier.classify(featureLists);
你可以从这里开始:试着弄清楚featureLists中有什么,它的大小等等,看看classify方法做了什么,如果你能“帮助”它在内存方面变得更有效率。例如,减少String的使用,并将其替换为StringBuilder和append (仅举个例子)。
https://stackoverflow.com/questions/33811026
复制相似问题