2012-08-31 55 views
0

我正在使用斯坦福NER来解析获取以下标记的句子:tokenize,ssplit,pos,引理,ner。我还通过Project-> Properties-> Run-> VM Options增加了netbeans中的内存到-Xms1600M -Xmx1600M。尽管如此,我正在让Java内存异常异常。 我在Windows 7 JDK版本1.7上运行32位Java。 这里是我的代码使用Netbeans在斯坦福大学NER上的Java堆空间错误

public ArrayList<String> NERTokensRet(String string) { 
    ArrayList<String> myArr = new ArrayList<String>(); 


    props = new Properties(); 
    props.put("annotators", "tokenize,ssplit,pos,lemma,ner"); 
    pipeline = new StanfordCoreNLP(props); 


    //  String resultString = string.replaceAll("[^\\p{L}\\p{N}]", " "); 
    Annotation annotation = new Annotation(string); 
    pipeline.annotate(annotation); 
    int j; 
    for (CoreMap sentence : annotation.get(CoreAnnotations.SentencesAnnotation.class)) { 
     List<CoreLabel> tokens = sentence.get(CoreAnnotations.TokensAnnotation.class); 

     for (j = 0; j < tokens.size(); j++) { 
      CoreLabel token = tokens.get(j); 
      myArr.add("[" + token.originalText() + "," + token.tag() + "," + token.beginPosition() + "," + token.endPosition() + "]"); 
     } 
     //System.out.println(myArr); 
    } 

    return myArr; 
} 

堆栈跟踪:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
at java.lang.AbstractStringBuilder.<init>(AbstractStringBuilder.java:45) 
at java.lang.StringBuilder.<init>(StringBuilder.java:68) 
at java.io.ObjectInputStream$BlockDataInputStream.readUTFBody(ObjectInputStream.java:2998) 
at java.io.ObjectInputStream$BlockDataInputStream.readUTF(ObjectInputStream.java:2819) 
at java.io.ObjectInputStream.readString(ObjectInputStream.java:1598) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1319) 
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350) 
at java.util.HashMap.readObject(HashMap.java:1030) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974) 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1848) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328) 
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946) 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328) 
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350) 
at edu.stanford.nlp.ie.crf.CRFClassifier.loadClassifier(CRFClassifier.java:2255) 
at edu.stanford.nlp.ie.AbstractSequenceClassifier.loadClassifier(AbstractSequenceClassifier.java:1444) 
at edu.stanford.nlp.ie.AbstractSequenceClassifier.loadClassifier(AbstractSequenceClassifier.java:1421) 
at edu.stanford.nlp.ie.AbstractSequenceClassifier.loadClassifier(AbstractSequenceClassifier.java:1500) 
at edu.stanford.nlp.ie.AbstractSequenceClassifier.loadClassifier(AbstractSequenceClassifier.java:1487) 
at edu.stanford.nlp.ie.crf.CRFClassifier.getClassifier(CRFClassifier.java:2386) 
at edu.stanford.nlp.ie.ClassifierCombiner.loadClassifierFromPath(ClassifierCombiner.java:130) 
at edu.stanford.nlp.ie.ClassifierCombiner.loadClassifiers(ClassifierCombiner.java:116) 
at edu.stanford.nlp.ie.ClassifierCombiner.<init>(ClassifierCombiner.java:98) 
at edu.stanford.nlp.ie.NERClassifierCombiner.<init>(NERClassifierCombiner.java:64) 
at edu.stanford.nlp.pipeline.StanfordCoreNLP$6.create(StanfordCoreNLP.java:500) 

能有人请尽快帮助?

+0

你是否从netbeans运行程序?你会得到什么错误? – assylias

+0

是的,我从netbeans运行它。错误是'java.lang.OutOfMemoryError' – harshit

+0

显示完整的堆栈跟踪 – assylias

回答

0

我卸载了所有东西(java和netbeans)并重新安装了所有东西(java和netbeans)。仍然不能分配-Xmx1400m,但分配-Xmx1000m并运行良好。感谢大家的努力。

2

stacktrace显示java在CoreNLP中加载用于NER的大型模型(特征和权重)时运行内存不足。这些确实使用了相当数量的内存,但这仍然是令人惊讶的。你不说什么操作系统,什么JDK版本,是否使用32/64位等等。但是对于上面的程序(添加了一个主要方法并填充了几种类型),在Linux上的Java 7u5(CentOS 5)上,我可以使用-mx700m(使用32位或64位Java - yay压缩哎呀)。所以我认为1600m应该足够用于任何架构/版本。

所以,我想尝试:

  • 运行带着几分更多的内存,看是否改变的东西(如-mx1800m)
  • 如果没有,请确保VM确实是获取上述状态的内存量(即使你写的内容看起来正确)。例如,尝试打印Runtime.getRuntime().maxMemory()/ 1024/1024.
+0

我在Windows 7 JDK版本1.6上运行32位Java。在运行Runtime.getRuntime()。maxMemory/1024/1024我得到247.我想我的虚拟机没有得到足够的内存。但为什么呢? – harshit

+0

升级到JDKversion 1.7即使它不起作用。我尝试使用旧的模型,即使那样也不工作。 – harshit