超级SV java库内存不足
下面是计算文件中行数的代码。它与超级SV java库内存不足,java,supercsv,Java,Supercsv,下面是计算文件中行数的代码。它与BufferedReader一起工作,并且很好。没问题。总共有超过25000000行 BufferedReader br = new BufferedReader(new FileReader("C:\\...test.csv")); int lineNbr = 0; while(br.readLine() != null) { lineNbr++;
BufferedReader
一起工作,并且很好。没问题。总共有超过25000000行
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);
下面是一个类似的代码。它在第11000000行之后抛出内存
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);
CsvListReader=newcsvlistreader(newfilereader(“C:\\…test.csv”)、CsvPreference.EXCEL\u首选项);
列表行=reader.read();
row=reader.read();
lineNbr=0;
而(reader.read()!=null){
lineNbr++;
如果(lineNbr%1000000==0){
系统输出打印项次(lineNbr);
}
}
reader.close();
系统出口(0);
我做错了什么?如何使用SuperCSV正确读取文件?主要区别:第一个示例只是从文件中读取一行,然后丢弃该行 您的第二个示例不仅读取字符串-请记住,调用
read()
将返回一个列表
!意思:CSV阅读器库可能正在做它的工作:它正在解析所有的输入数据。这需要更多的资源,而不仅仅是阅读并扔掉它们
因此,第二个示例很可能以如此高的速率创建垃圾,以至于垃圾收集器无法处理它 主要区别:第一个示例只是从文件中读取一行,然后丢弃该行 您的第二个示例不仅读取字符串-请记住,调用
read()
将返回一个列表
!意思:CSV阅读器库可能正在做它的工作:它正在解析所有的输入数据。这需要更多的资源,而不仅仅是阅读并扔掉它们
因此,第二个示例很可能以如此高的速率创建垃圾,以至于垃圾收集器无法处理它 根据您的示例代码和对SuperCSV代码的快速查看,我看不出抛出OutOfMemory异常的任何原因。我怀疑你没有发布你的样本中的所有信息,或者有其他的东西在起作用 您可以在此处查看SuperCSV的源代码:
另一种可能是您的CSV文件已损坏,可能在某个点缺少换行符。库至少在一个位置进行readLine调用。根据您的示例代码和对SuperCSV代码的快速查看,我看不出引发OutOfMemory异常的任何原因。我怀疑你没有发布你的样本中的所有信息,或者有其他的东西在起作用 您可以在此处查看SuperCSV的源代码:
另一种可能是您的CSV文件已损坏,可能在某个点缺少换行符。库至少在一个位置进行readLine调用。不知道框架,但如果
CsvListReader
急切地解析所有数据,您的堆内存会很快膨胀……是的。但是垃圾收集器不应该处理这个吗?我不使用解析的结果,您无法真正预测垃圾回收何时发生。可能是解析后的数据没有足够快地被反引用,或者根本没有被反引用。我不知道框架,但是如果CsvListReader
急切地解析所有数据,你的堆内存会很快膨胀……是的,它会。但是垃圾收集器不应该处理这个吗?我不使用解析的结果,您无法真正预测垃圾回收何时发生。可能是解析后的数据没有足够快或根本没有被反引用。