以下是计算文件中行数的代码。它适用于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正确读取文件?
答案 0 :(得分:4)
根据您的示例代码和SuperCSV代码的快速回顾,我没有看到任何抛出OutOfMemory异常的原因。我怀疑你没有在你的样本中发布所有信息,或者其他东西正在发挥作用。
您可以在此处查看SuperCSV的源代码:
我没有看到任何存储状态会导致引用堆内存以无法收集垃圾的方式增长。
另一种可能性是您的CSV文件已损坏,可能在某些时候缺少换行符。该库至少在一个位置进行readLine调用。
答案 1 :(得分:3)
主要区别:您的第一个示例只是从文件中读取一行,并丢弃该行。
您的第二个示例不仅会读取字符串 - 请记住,对read()
的调用会返回List<String>
!含义:CSV阅读器库可能正在完成其工作:解析所有输入数据。这仅仅需要更多的资源,而不仅仅是阅读线条并扔掉它们。
所以,很有可能,第二个例子以如此高的速率创建 garbage ,垃圾收集器不处理它。