这是计算文件中的行数的代码。它可以与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调用。