添加属性时超出 GC 开销限制
GC overhead limit exceeded when adding properties
我刚开始为 java 使用 StanfordCoreNlp 库,在添加 coref 或 dcoref 注释属性时,我一直收到 GC 开销限制错误。知道如何解决这个问题吗?
出于测试目的,我逐渐将 JVM maxHeap 内存更改为 8GB ram,这绝对不是 issue.I 尝试从属性中删除几个标签,这是唯一一个似乎可以解决开销的标签错误,它也只在 StanfordCoreNlp 上给出错误,simpleCore api 可以正常工作,但效果不佳。代码片段与斯坦福官方文档中提供的示例相同。
public static void main(String[] args) {
// run all Annotators on this text
Properties props = new Properties();
props.setProperty("annotators", "tokenize, ssplit, pos, lemma,ner, parse, coref");
StanfordCoreNLP pipeline = new StanfordCoreNLP(props);
// read some text in the text variable
String text = "who is here?"; // Add your text here!
Annotation document = new Annotation(text);
// run all Annotators on this text
pipeline.annotate(document);
这是确切的错误消息:
Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
at java.util.Arrays.copyOfRange(Arrays.java:3664)
at java.lang.String.<init>(String.java:207)
at edu.stanford.nlp.util.StringUtils.splitOnChar(StringUtils.java:537)
at edu.stanford.nlp.coref.data.Dictionaries.loadGenderNumber(Dictionaries.java:406)
at edu.stanford.nlp.coref.data.Dictionaries.<init>(Dictionaries.java:676)
at edu.stanford.nlp.coref.data.Dictionaries.<init>(Dictionaries.java:576)
at edu.stanford.nlp.coref.CorefSystem.<init>(CorefSystem.java:32)
at edu.stanford.nlp.pipeline.CorefAnnotator.<init>(CorefAnnotator.java:67)
at edu.stanford.nlp.pipeline.AnnotatorImplementations.coref(AnnotatorImplementations.java:196)
at edu.stanford.nlp.pipeline.StanfordCoreNLP.lambda$getNamedAnnotators(StanfordCoreNLP.java:532)
at edu.stanford.nlp.pipeline.StanfordCoreNLP$$Lambda/2137589296.apply(Unknown Source)
at edu.stanford.nlp.pipeline.StanfordCoreNLP.lambda$null(StanfordCoreNLP.java:602)
at edu.stanford.nlp.pipeline.StanfordCoreNLP$$Lambda/1798286609.get(Unknown Source)
at edu.stanford.nlp.util.Lazy.compute(Lazy.java:126)
at edu.stanford.nlp.util.Lazy.get(Lazy.java:31)
at edu.stanford.nlp.pipeline.AnnotatorPool.get(AnnotatorPool.java:149)
at edu.stanford.nlp.pipeline.StanfordCoreNLP.<init>(StanfordCoreNLP.java:251)
at edu.stanford.nlp.pipeline.StanfordCoreNLP.<init>(StanfordCoreNLP.java:192)
at edu.stanford.nlp.pipeline.StanfordCoreNLP.<init>(StanfordCoreNLP.java:188)
at StanfordCoreNLPtest.main(StanfordCoreNLPtest.java:31)
进程已完成,退出代码为 1
据我所知,这只能是Java 运行内存不足导致的——这里只是加载字典,并没有陷入任何死循环。您确定要指定如何正确设置可用内存吗?例如,如果 运行ning 在 Eclipse 下,您需要设置应用程序的内存而不是分配给 Eclipse 的内存。 8GB 应该足以 运行 带有任何选项的 CoreNLP(除非文档很大,但文档加载发生在加载 coref 之后)。但是您可以尝试使用 12GB 以防万一,看看会发生什么....
我刚开始为 java 使用 StanfordCoreNlp 库,在添加 coref 或 dcoref 注释属性时,我一直收到 GC 开销限制错误。知道如何解决这个问题吗?
出于测试目的,我逐渐将 JVM maxHeap 内存更改为 8GB ram,这绝对不是 issue.I 尝试从属性中删除几个标签,这是唯一一个似乎可以解决开销的标签错误,它也只在 StanfordCoreNlp 上给出错误,simpleCore api 可以正常工作,但效果不佳。代码片段与斯坦福官方文档中提供的示例相同。
public static void main(String[] args) {
// run all Annotators on this text
Properties props = new Properties();
props.setProperty("annotators", "tokenize, ssplit, pos, lemma,ner, parse, coref");
StanfordCoreNLP pipeline = new StanfordCoreNLP(props);
// read some text in the text variable
String text = "who is here?"; // Add your text here!
Annotation document = new Annotation(text);
// run all Annotators on this text
pipeline.annotate(document);
这是确切的错误消息:
Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
at java.util.Arrays.copyOfRange(Arrays.java:3664)
at java.lang.String.<init>(String.java:207)
at edu.stanford.nlp.util.StringUtils.splitOnChar(StringUtils.java:537)
at edu.stanford.nlp.coref.data.Dictionaries.loadGenderNumber(Dictionaries.java:406)
at edu.stanford.nlp.coref.data.Dictionaries.<init>(Dictionaries.java:676)
at edu.stanford.nlp.coref.data.Dictionaries.<init>(Dictionaries.java:576)
at edu.stanford.nlp.coref.CorefSystem.<init>(CorefSystem.java:32)
at edu.stanford.nlp.pipeline.CorefAnnotator.<init>(CorefAnnotator.java:67)
at edu.stanford.nlp.pipeline.AnnotatorImplementations.coref(AnnotatorImplementations.java:196)
at edu.stanford.nlp.pipeline.StanfordCoreNLP.lambda$getNamedAnnotators(StanfordCoreNLP.java:532)
at edu.stanford.nlp.pipeline.StanfordCoreNLP$$Lambda/2137589296.apply(Unknown Source)
at edu.stanford.nlp.pipeline.StanfordCoreNLP.lambda$null(StanfordCoreNLP.java:602)
at edu.stanford.nlp.pipeline.StanfordCoreNLP$$Lambda/1798286609.get(Unknown Source)
at edu.stanford.nlp.util.Lazy.compute(Lazy.java:126)
at edu.stanford.nlp.util.Lazy.get(Lazy.java:31)
at edu.stanford.nlp.pipeline.AnnotatorPool.get(AnnotatorPool.java:149)
at edu.stanford.nlp.pipeline.StanfordCoreNLP.<init>(StanfordCoreNLP.java:251)
at edu.stanford.nlp.pipeline.StanfordCoreNLP.<init>(StanfordCoreNLP.java:192)
at edu.stanford.nlp.pipeline.StanfordCoreNLP.<init>(StanfordCoreNLP.java:188)
at StanfordCoreNLPtest.main(StanfordCoreNLPtest.java:31)
进程已完成,退出代码为 1
据我所知,这只能是Java 运行内存不足导致的——这里只是加载字典,并没有陷入任何死循环。您确定要指定如何正确设置可用内存吗?例如,如果 运行ning 在 Eclipse 下,您需要设置应用程序的内存而不是分配给 Eclipse 的内存。 8GB 应该足以 运行 带有任何选项的 CoreNLP(除非文档很大,但文档加载发生在加载 coref 之后)。但是您可以尝试使用 12GB 以防万一,看看会发生什么....