2017-06-08 14 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

相關問題