【问题标题】:OutOfMemoryError while parsing CSV解析 CSV 时出现 OutOfMemoryError
【发布时间】:2017-06-01 00:03:00
【问题描述】:

我有一个巨大的 csv 文件 (500MB) 和 40 万条记录

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

栏目文字包含很多信息和句子。我想获取此列(“文本”),将所有非字母符号替换为“”,并以从“文本”列中最常见的单词到最不常见的单词的倒序排序,限制为 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 超出了内存不足错误。如何做到最好?我无法增加堆大小,我只需要使用默认设置

【问题讨论】:

  • 什么时候内存不足?是在将单词添加到listWords 时发生还是在排序时发生?
  • 当我将单词添加到 listWords 时会发生这种情况

标签: java csv out-of-memory


【解决方案1】:

针对该问题的建议:不要在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();
}

【讨论】:

  • 非常感谢!它帮助了
猜你喜欢
  • 1970-01-01
  • 2012-10-21
  • 2023-02-16
  • 1970-01-01
  • 2014-05-24
  • 1970-01-01
  • 1970-01-01
  • 2014-09-05
  • 1970-01-01
相关资源
最近更新 更多