2017-06-08 13 views
1

我想解析一个大文件(650万行),但得到了提到的内存不足错误。我使用相同的方法来读取大约50K行的其他文件,并且它工作得很快。这里运行得非常慢,然后失败并出现错误。我最初有2 GB专用于intelliJ,我将其更改为4 GB(-Xmx4000m),然后是6 GB(-Xmx6000m),并且仍然以相同的错误结束。我的电脑只有8 GB内存,所以我不能再做更高的了。有什么建议么?读取较大的管道​​分隔值时超出了GC开销限制文件

谢谢!

public static List<UmlsEntry> umlsEntries(Resource resource) throws 
IOException { 
return CharStreams.readLines(new InputStreamReader(resource.getInputStream())).stream().distinct() 
    .map(UmlsParser::toUmlsEntry).collect(Collectors.toList()); 
} 

private static UmlsEntry toUmlsEntry(String line) { 
String[] umlsEntry = line.split("|"); 

return new UmlsEntry(umlsEntry[UNIQUE_IDENTIFIER_FOR_CONCEPT_COLUMN_INDEX], 
    umlsEntry[LANGUAGE_OF_TERM_COLUMN_INDEX], umlsEntry[TERM_STATUS_COLUMN_INDEX], 
    umlsEntry[UNIQUE_IDENTIFIER_FOR_TERM_COLUMN_INDEX], umlsEntry[STRING_TYPE_COLUMN_INDEX], 
    umlsEntry[UNIQUE_IDENTIFIER_FOR_STRING_COLUMN_INDEX], 
    umlsEntry[IS_PREFERRED_STRING_WITHIN_THIS_CONCEPT_COLUMN_INDEX], 
    umlsEntry[UNIQUE_IDENTIFIER_FOR_ATOM_COLUMN_INDEX], umlsEntry[SOURCE_ASSERTED_ATOM_INDENTIFIER_COLUMN_INDEX], 
    umlsEntry[SOURCE_ASSERTED_CONCEPT_IDENTIFIER_COLUMN_INDEX], 
    umlsEntry[SOURCE_ASSERTED_DESCRIPTOR_IDENTIFIER_COLUMN_INDEX], 
    umlsEntry[ABBREVIATED_SOURCE_NAME_COLUMN_IDENTIFIER_COLUMN_INDEX], 
    umlsEntry[ABBREVIATION_FOR_TERM_TYPE_IN_SOURCE_VOCABULARY_COLUMN_INDEX], 
    umlsEntry[MOST_USEFUL_SOURCE_ASSERTED_IDENTIFIER_COLUMN_INDEX], umlsEntry[STRING_COLUMN_INDEX], 
    umlsEntry[SOURCE_RESTRICTION_LEVEL_COLUMN_INDEX], umlsEntry[SUPPRESSIBLE_FLAG_COLUMN_INDEX], 
    umlsEntry[CONTENT_VIEW_FLAG_COLUMN_INDEX]); 
} 
+0

请发布堆栈跟踪。哪一行导致错误? – ItamarG3

+0

啊我没有复制它,当我外出吃午饭时我会运行它,它使用我所有的记忆,所以我几乎不能做任何事情。将很快与我联系... – Rotavator

回答

1

您需要一次处理几行以避免耗尽所有可用内存,因为该文件不适合内存。 CharStreams.readLines混淆不是流。它一次读取所有行并返回一个列表。这不起作用。改为尝试File.lines。我怀疑你也会遇到distinct的问题。它需要跟踪所有线路的所有散列,如果这个气球太远,你可能不得不改变这种策略。哦,如果没有足够的内存来保存结果,则collect也不起作用。那么你可能想写一个新的文件或数据库等等。

下面是如何可以从流式传输文件线,计算不同的条目,并打印各行的MD5一个示例:如果遇到故障检测不同行

Files.lines(FileSystems.getDefault().getPath("/my/file")) 
      .distinct() 
      .map(DigestUtils::md5) 
      .forEach(System.out::println); 

,排序文件IN-先放置,然后只滤出相同的相邻行。

+0

是的,事实证明我的机器功能不足以保存整个列表而不退出所有程序。可以加载所有的线路,但是一旦超过100万就加入列表,变得非常慢。 – Rotavator

相关问题