【发布时间】:2017-08-21 01:46:46
【问题描述】:
我正在使用带有Apache OpenNLP 的Java8。我有一项服务可以从一段中提取所有名词。这在我的本地主机服务器上按预期工作。我也在OpenShift 服务器上运行,没有任何问题。但是,它确实会占用大量内存。我需要将我的应用程序部署到AWS Elastic Beanstalk Tomcat Server。
一个解决方案是我可以从 AWS Elastic Beanstalk Tomcat Server t1.micro 升级到另一种实例类型。但我的预算很少,如果可能的话,我想避免使用extra fees。
当我运行应用程序并尝试执行单词分块时,它收到以下错误:
dispatch failed; nested exception is java.lang.OutOfMemoryError: Java heap space] with root cause java.lang.OutOfMemoryError: Java heap space at opennlp.tools.ml.model.AbstractModelReader.getParameters(AbstractModelReader.java:148) at opennlp.tools.ml.maxent.io.GISModelReader.constructModel(GISModelReader.java:75) at opennlp.tools.ml.model.GenericModelReader.constructModel(GenericModelReader.java:59) at opennlp.tools.ml.model.AbstractModelReader.getModel(AbstractModelReader.java:87) at opennlp.tools.util.model.GenericModelSerializer.create(GenericModelSerializer.java:35) at opennlp.tools.util.model.GenericModelSerializer.create(GenericModelSerializer.java:31) at opennlp.tools.util.model.BaseModel.finishLoadingArtifacts(BaseModel.java:328) at opennlp.tools.util.model.BaseModel.loadModel(BaseModel.java:256) at opennlp.tools.util.model.BaseModel.<init>(BaseModel.java:179) at opennlp.tools.parser.ParserModel.<init>(ParserModel.java:180) at com.jobs.spring.service.lang.LanguageChunkerServiceImpl.init(LanguageChunkerServiceImpl.java:35) at com.jobs.spring.service.lang.LanguageChunkerServiceImpl.getNouns(LanguageChunkerServiceImpl.java:46)
问题
有没有办法:
减少从段落中提取名词时使用的内存量。
使用除 Apache OpenNLP 之外的其他 api,它不会占用太多内存。
一种配置AWS Elastic Beanstalk Tomcat Server 以满足需求的方法。
代码示例:
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashSet;
import java.util.Set;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import opennlp.tools.cmdline.parser.ParserTool;
import opennlp.tools.parser.Parse;
import opennlp.tools.parser.Parser;
import opennlp.tools.parser.ParserFactory;
import opennlp.tools.parser.ParserModel;
import opennlp.tools.util.InvalidFormatException;
@Component("languageChunkerService")
@Transactional
public class LanguageChunkerServiceImpl implements LanguageChunkerService {
private Set<String> nouns = null;
private InputStream modelInParse = null;
private ParserModel model = null;
private Parser parser = null;
public void init() throws InvalidFormatException, IOException {
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("en-parser-chunking.bin").getFile());
modelInParse = new FileInputStream(file.getAbsolutePath());
// load chunking model
model = new ParserModel(modelInParse); // line 35
// create parse tree
parser = ParserFactory.create(model);
}
@Override
public Set<String> getNouns(String sentenceToExtract) {
Set<String> extractedNouns = new HashSet<String>();
nouns = new HashSet<>();
try {
if (parser == null) {
init();
}
Parse topParses[] = ParserTool.parseLine(sentenceToExtract, parser, 1);
// call subroutine to extract noun phrases
for (Parse p : topParses) {
getNounPhrases(p);
}
// print noun phrases
for (String s : nouns) {
String word = s.replaceAll("[^a-zA-Z ]", "").toLowerCase();// .split("\\s+");
//System.out.println(word);
extractedNouns.add(word);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (modelInParse != null) {
try {
modelInParse.close();
} catch (IOException e) {
}
}
}
return extractedNouns;
}
// recursively loop through tree, extracting noun phrases
private void getNounPhrases(Parse p) {
if (p.getType().equals("NN")) { // NP=noun phrase
// System.out.println(p.getCoveredText()+" "+p.getType());
nouns.add(p.getCoveredText());
}
for (Parse child : p.getChildren())
getNounPhrases(child);
}
}
更新
Tomcat8 配置:
【问题讨论】:
-
在您的计算机上运行分析器以查看程序在正常运行期间需要什么样的内存量,然后您可以确定需要增加多少预算。即使你可以减少一些小块,你仍然会在内存边缘运行,这会使其非常不稳定。
-
好主意。会做。另外,你认为有办法减少
en-parser-chunking.bin吗?即它可能正在加载一些我可能不需要的功能。我知道 OpenNLP 做了很多不同的语言解析,我只需要提取名词。 -
我对 OpenNLP 不熟悉,但由于它可能占用了您的大部分内存,您可能需要非常仔细地阅读文档。
-
也许我应该使用不同的工具包。有没有人有这方面的经验,可以推荐一个:en.wikipedia.org/wiki/…
-
顺便问一下,你有多少内存(1GB?)?你给 Tomcat 多少堆,系统上还有其他东西在运行吗?
标签: java amazon-web-services amazon-elastic-beanstalk opennlp