这是计算文件中的行数的代码。它可以与BufferedReader一起使用并且很好。没问题 。总共超过25,000,000行

  BufferedReader br = new BufferedReader(new FileReader("C:\\...test.csv"));
            int lineNbr = 0;
            while(br.readLine() != null) {
                lineNbr++;
                if (lineNbr%1000000==0) {
                    System.out.println(lineNbr);
                }
            }
  br.close();
  System.exit(0);


这是SuperCSV的类似代码。在第11,000,000行后抛出out of memory

 CsvListReader reader = new CsvListReader(new FileReader("C:\\... test.csv"), CsvPreference.EXCEL_PREFERENCE );

             List<String> row = reader.read();
            row = reader.read();
                lineNbr = 0;
            while (reader.read() != null) {
                lineNbr++;
                if (lineNbr%1000000==0) {
                    System.out.println(lineNbr);
                }


            }

            reader.close();
            System.exit(0);


我究竟做错了什么?如何使用SuperCSV正确读取文件?

最佳答案

根据您的示例代码和对SuperCSV代码的快速检查,我看不到抛出OutOfMemory异常的任何原因。我怀疑您没有在样本中发布所有信息,或者有其他原因。

您可以在此处查看SuperCSV的源代码:


https://super-csv.github.io/super-csv/xref/index.html


我看不到任何状态的存储,这会导致引用的堆内存以无法进行垃圾收集的方式增长。

另一种可能性是您的CSV文件已损坏,有时可能缺少换行符。该库至少在一个位置进行readLine调用。

10-04 11:02