gpt4 book ai didi

java - 程序可能由于垃圾收集问题而停止运行

转载 作者:行者123 更新时间:2023-12-02 06:15:27 36 4
gpt4 key购买 nike

我在名为 Extract 的类中具有以下格式。该类有一个 main 方法,该方法应该从文本文件中读取行并将其输出到另一个文本文件。这是概述:

 Public class Extract{
public static void main(String[] args){

try{

Scanner br = new Scanner(new FileInputStream(file_from)); // read from file
Printwriter out = new PrintWriter ( new BufferedWriter (file_to))); // File to write to

while(br.hasNextLine())
{
ArrayList<String> sentences = new ArrayList<String>();
String some_sentence;
for (int i = 0 ; i < 1000 ; i++)
{
some_sentence = br.nextLine();
if (some_sentence != null){
sentence.add(some_sentence);
}
}
for (int i = 0 ; i < sentences.size() ; i++)
{
some_sentence = sentences.get(i);
// prepare sentence to be parsed
Tree parsed = lp.parse(some_sentence);
TreebankLanguagePack tlp = new PennTreebankLanguagePack();
GrammaticalStructureFactory gsf = tlp.grammaticalStructureFactory();
GrammaticalStructure gs = gsf.newGrammaticalStructure(parsed);
Collection<TypedDependency> tdl = gs.typedDependencies();
Iterator<TypedDependency> itr = tdl.iterator();

out.println(some_sentence);
out.println("\n");
System.out.println(++count);
while (itr.hasNext()) {
TypedDependency temp = itr.next();
out.println(temp);
}
}
}

} catch (Exception e) {
System.out.println("Something failed");
e.printStackTrace();
}

}
}

鉴于我在 while 循环的每次迭代中使用 1000 个新字符串初始化数组 sentences,这是否会导致我的程序停止运行?我的程序正在退出并显示以下错误消息:

NOT ENOUGH MEMORY TO PARSE SENTENCES OF LENGTH 500
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at edu.stanford.nlp.parser.lexparser.ExhaustivePCFGParser.createArrays(ExhaustivePCFGParser.java:2203)
at edu.stanford.nlp.parser.lexparser.ExhaustivePCFGParser.considerCreatingArrays(ExhaustivePCFGParser.java:2173)
at edu.stanford.nlp.parser.lexparser.ExhaustivePCFGParser.parse(ExhaustivePCFGParser.java:346)
at edu.stanford.nlp.parser.lexparser.LexicalizedParserQuery.parseInternal(LexicalizedParserQuery.java:238)
at edu.stanford.nlp.parser.lexparser.LexicalizedParserQuery.parse(LexicalizedParserQuery.java:530)
at edu.stanford.nlp.parser.lexparser.LexicalizedParser.parse(LexicalizedParser.java:301)
at edu.stanford.nlp.parser.lexparser.LexicalizedParser.parse(LexicalizedParser.java:279)
at Pubmedparse2.main(Pubmedparse2.java:52

如果我在 while 循环的每次迭代中释放 1000 个死 String 对象,垃圾回收是否无法正常工作? (请注意,错误中列出的包是用于将句子解析为语法关系的包)。

感谢您的帮助。

最佳答案

虽然垃圾收集器是一种神秘的野兽,甚至会以意想不到的方式袭击经验丰富的开发人员,但我怀疑它与本例有关(除非您的输入文件大于 10 MB)。

我的猜测是你在代码中犯了一个错误。使用真正的调试器或 poor man's debugging看看代码到底在做什么。

[编辑]您似乎正在使用 the Stanford NLP parser .

来自文档:

at least 100MB to run as a PCFG parser on sentences up to 40 words in length; typically around 500MB of memory to be able to parse similarly long typical-of-newswire sentences using the factored model

查看 Java VM 的文档,了解如何为其提供更多内存。

关于java - 程序可能由于垃圾收集问题而停止运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21528938/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com