超级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
急切地解析所有数据,你的堆内存会很快膨胀……是的,它会。但是垃圾收集器不应该处理这个吗?我不使用
解析的结果,您无法真正预测垃圾回收何时发生。可能是解析后的数据没有足够快或根本没有被反引用。