2017-05-29 2 views
0

を解析している間、私は列のテキストは多くの情報や文章で構成OutOfMemoryErrorのCSV

id, name, comment, text 
1, Alex, Hello, I believe in you 

それで一つの巨大なcsvファイル(500メガバイト)と400Kレコードを持っています。私はこの列( "テキスト")を取得し、アルファベット以外の記号をすべて ""に置き換え、列 "Text"の最も頻繁な単語から1000の最も頻度の低い単語と逆順にソートします。これは、 。私はCsvReaderライブラリを使用しています

CsvReader doc = new CsvReader("My CSV Name"); 
     doc.readHeaders(); 
     try { 
      List<String> listWords = new ArrayList<>(); 
      while (doc.readRecord()) { 
       listWords.addAll(Arrays.asList(doc.get("Text"/*my column name*/).replaceAll("\\P{Alpha}", " ").toLowerCase().trim().split("[ ]+"))); 
      } 

      Map<String, Long> sortedText = listWords.stream() 
        .collect(groupingBy(chr -> chr, counting())) 
        .entrySet().stream() 
        .sorted(Map.Entry.comparingByValue(Collections.reverseOrder())) 
        .limit(1000) 
        .collect(Collectors.toMap(
          Map.Entry::getKey, 
          Map.Entry::getValue, 
          (e1, e2) -> e1, 
          LinkedHashMap::new 
        )); 
      sortedText.forEach((k, v) -> System.out.println("Word: " + k + " || " + "Count: " + v)); 
      doc.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      doc.close(); 
     } 

実行後、GCが超過したというメモリ不足エラーが発生しました。どのように最善を尽くすか?ヒープサイズを増やすことはできません。デフォルト設定で作業する必要があります

+1

た時点では、メモリが不足している:

コードは次のようなものになるだろうか? 'listWords'に単語を追加するときや、それをソートするときに起こるのでしょうか? – radimpe

+0

リストワードに単語を追加すると起こります –

答えて

0

listWordsにすべての単語を追加する代わりに、各CSV行の単語のアカウンティングを処理してみてください。

CsvReader doc = null; 

try { 

    doc = new CsvReader(""My CSV Name"); 
    doc.readHeaders(); 

    Map<String, Long> mostFrequent = new HashMap<String, Long>(); 

    while (doc.readRecord()) { 

     Arrays.asList(doc.get("text"/*my column name*/).replaceAll("\\P{Alpha}", " ").toLowerCase().trim().split("[ ]+")). 
     stream().forEach(word -> { 

      if (mostFrequent.containsKey(word)) { 
       mostFrequent.put(word, mostFrequent.get(word) + 1); 
      } 
      else { 
       mostFrequent.put(word, 1l); 
      } 
     }); 
    } 

    Map<String, Long> sortedText = mostFrequent.entrySet().stream() 
     .sorted(Map.Entry.<String, Long>comparingByValue().reversed()) 
     .limit(1000) 
     .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, 
       (e1, e2) -> e1, LinkedHashMap::new)); 

    sortedText.forEach((k, v) -> System.out.println("Word: " + k + " || " + "Count: " + v)); 

    doc.close(); 

} catch (IOException e) { 
    e.printStackTrace(); 
} finally { 
    doc.close(); 
} 
+0

ありがとうございました! –