superCSV java 库内存不足

Out of memory with superCSV java library

这是计算文件行数的代码。它适用于 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 正确读取文件?

主要区别:您的第一个示例只是从文件中读取一行,然后丢弃它。

您的第二个示例不仅读取字符串 - 请记住调用 read() returns a List<String>!意思是:CSV reader 库可能正在完成它的工作:它正在 解析 您所有的输入数据。这需要的资源比仅仅阅读行然后扔掉要多得多。

因此,第二个示例很可能会以如此高的速度创建 垃圾,以至于垃圾收集器无法处理它。

根据您的示例代码和对 SuperCSV 代码的快速查看,我看不出有任何理由引发 OutOfMemory 异常。我怀疑您没有 post 样本中的所有信息,或者其他原因在起作用。

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

我没有看到任何存储的状态会导致引用的堆内存以无法被垃圾收集的方式增长。

另一种可能是您的 CSV 文件已损坏,可能在某些地方缺少换行符。库至少在一个位置进行 readLine 调用。