来自Stanford的R coreNLP包的initCoreNLP()方法调用抛出错误

时间:2015-10-08 12:28:44

标签: r stanford-nlp

我正在尝试使用coreNLP包。我运行了以下命令,遇到 GC开销限制超出错误。

library(rJava)

downloadCoreNLP()

initCoreNLP()

错误是这样的:

  

从edu / stanford / nlp / models / ner / english.conll.4class.distsim.crf.ser.gz加载分类器... rJava ::。jnew(“edu.stanford.nlp.pipeline.StanfordCoreNLP”中的错误“,basename(path)):     java.lang.OutOfMemoryError:超出了GC开销限制   换行时出错:无法打开连接

我对Java知之甚少,有人可以帮我解决这个问题吗?

3 个答案:

答案 0 :(得分:2)

我发现了一个更通用的解决方案:增加rJava的堆空间,如here所述:

原因:依赖于rJava的库的默认堆大小为512MB。超过这个最大尺寸相对容易。

解决方案:在rJava的选项支持中增加JVM堆大小:

options(java.parameters = "-Xmx4096m")

请注意,此步骤必须在加载任何软件包之前执行

然后我跑了:

initCoreNLP(mem = "4g")

...并且整个CoreNLP已成功加载并运行。

答案 1 :(得分:0)

尝试以下方法,但徒劳无功 -

options(java.parameters =“ - Xmx1000m”) - 增加堆大小
gc() - 这将导致垃圾收集自动发生

重新启动机器后,最终自行解决了!

答案 2 :(得分:0)

@indi我遇到了同样的问题(见R's coreNLP::initCoreNLP() throws java.lang.OutOfMemoryError),但能够提出一个比重新启动更可重复的解决方案。

init命令的完整语法是

initCoreNLP(libLoc, parameterFile, mem = "4g", annotators)

增加mem并没有帮助我,但我意识到你和我都被ner注释器(命名实体识别)中的一个分类器卡住了。由于我所需要的只是词性标注,我用以下内容替换了init命令:

initCoreNLP(mem = "8g", annotators = c("tokenize", "ssplit", "pos"))

这导致init命令在闪存中执行且没有内存问题。顺便说一下,我将mem增加到8g只是因为我有那么多RAM。我敢肯定我可以把它留在默认的4g上,它会很好。

我不知道你是否需要ner注释器。如果没有,则显式列出annotators参数。以下是可能值的列表:http://stanfordnlp.github.io/CoreNLP/annotators.html。只需选择你完成工作所需的那些。如果你确实需要ner,那么再次找出你需要的最小注释器集并指定它们。

所以你(希望其他人)去吧!