Standford-NLP:在Tomcat上使用解析器时出现的GC开销限制。

时间:2017-03-09 08:54:30

标签: java tomcat garbage-collection stanford-nlp

我们正在努力将Stanford NLP集成到我们的系统上,它工作正常,只是它导致gc overhead limit exceeded。我们有内存转储并将对其进行分析,但如果ányone对此问题有所了解,请告诉我们。服务器非常强大,SSD,32GB RAM,至强E5系列。

我们的代码:

 String text = Jsoup.parse(groupNotes.getMnotetext()).text();
                String lang;
                try {
                    DetectorFactory.clear();
                    DetectorFactory.loadProfile("/home/deploy/profiles/");
                    Detector detector = DetectorFactory.create();
                    detector.append(text);
                     lang = detector.detect();
                }catch (Exception ignored){
                    lang = "de";
                }

                LexicalizedParser lp;
                if (lang.toLowerCase().equals("de")) {
                    lp = LexicalizedParser.loadModel(GERMAN_PCG_MODEL);
                } else {
                    lp = LexicalizedParser.loadModel(ENGLISH_PCG_MODEL);
                }
                Tree parse;
                parse = lp.parse(text);
                List<String> stringList = new ArrayList<>();
                List taggedWords = parse.taggedYield();
               // System.out.println(taggedWords);
                for (Object str : taggedWords) {
                    if (str.toString().contains("NN")) {
                        stringList.add(str.toString().replace("/NN", ""));
                    }
                    if (str.toString().contains("NNS")) {
                        stringList.add(str.toString().replace("/NNS", ""));
                    }
                    if (str.toString().contains("NNP")) {
                        stringList.add(str.toString().replace("/NNP", ""));
                    }
                    if (str.toString().contains("NNPS")) {
                        stringList.add(str.toString().replace("/NNPS", ""));
                    }
                    if (str.toString().contains("VB")) {
                        stringList.add(str.toString().replace("/VB", ""));
                    }
                    if (str.toString().contains("VBD")) {
                        stringList.add(str.toString().replace("/VBD", ""));
                    }
                    if (str.toString().contains("VBG")) {
                        stringList.add(str.toString().replace("/VBG", ""));
                    }
                    if (str.toString().contains("VBN")) {
                        stringList.add(str.toString().replace("/VBN", ""));
                    }
                    if (str.toString().contains("VBZ")) {
                        stringList.add(str.toString().replace("/VBZ", ""));
                    }
                    if (str.toString().contains("VBP")) {
                        stringList.add(str.toString().replace("/VBP", ""));
                    }
                    if (str.toString().contains("JJ")) {
                        stringList.add(str.toString().replace("/JJ", ""));
                    }
                    if (str.toString().contains("JJR")) {
                        stringList.add(str.toString().replace("/JJR", ""));
                    }
                    if (str.toString().contains("JJS")) {
                        stringList.add(str.toString().replace("/JJS", ""));
                    }
                    if (str.toString().contains("FW")) {
                        stringList.add(str.toString().replace("/FW", ""));
                    }
                }

Apache tomcat的JVM选项:

CATALINA_OPTS="$CATALINA_OPTS -server -Xms2048M -Xmx3048M -XX:OnOutOfMemoryError="/home/deploy/scripts/tomcatrestart.sh" -XX:+UseParallelGC -XX:+HeapDumpOnOutOfMemory -XX:HeapDumpPath=/path/to/date.hprof -XX:-UseGCOverheadLimit -Dspring.security.strategy=MODE_INHERITABLETHREADLOCAL"

有什么想法吗?

POM.xml:

  <dependency>
            <groupId>edu.stanford.nlp</groupId>
            <artifactId>stanford-corenlp</artifactId>
            <version>3.7.0</version>
            <classifier>models</classifier>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>edu.stanford.nlp</groupId>
            <artifactId>stanford-corenlp</artifactId>
            <version>3.7.0</version>
            <classifier>models-german</classifier>
            <scope>provided</scope>
        </dependency>
 <dependency>
            <groupId>edu.stanford.nlp</groupId>
            <artifactId>stanford-parser</artifactId>
            <version>3.7.0</version>
         <scope>provided</scope>
        </dependency>


     <dependency>
            <groupId>edu.stanford.nlp</groupId>
            <artifactId>stanford-corenlp</artifactId>
            <version>3.7.0</version>
         <scope>provided</scope>
        </dependency>

1 个答案:

答案 0 :(得分:0)

为了澄清一些事情,lp.parse(...)应该在句子上运行,而不是段落或文档。 lp.parse(...)接受一个句子并返回句子的解析树。如果在段落或文档长度文本上运行它,肯定会出现崩溃问题。如果您使用管道API,您还可以设置解析将运行的最大长度句子,如果您提交的句子长于句子,则只需要进行平面解析。在现实世界的NLP中,你经常会遇到一些巨大的句子,这些句子只是事物的列表,因为解析器会崩溃,所以跳过这些很有帮助。正如我在评论中提到的,您可以在此处了解有关管道API的更多信息:http://stanfordnlp.github.io/CoreNLP/api.html