我正在尝试使用Java读取1,000,000行CSV文件。我正在使用OpenCSV库,它可以在30,000行的较小文件上正常工作。在不到半秒的时间内处理它。但是当我尝试从一百万行文件中读取时,它永远不会结束。在Java中读取大型CSV文件
现在我测试看看,什么时候会真正停止,并用自己的二进制搜索的版本,我第一次尝试阅读500K线,然后250K,等等,我发现它容易读数145k行,在0.5-0.7sec,而150k甚至没有完成。
我已经彻底搜索过,发现了几个我在代码中使用的解决方案,例如使用BufferedReader
,BufferedInputStream
等,但没有一个解决了它。仍然失败145-150k线。
这是我的代码的相关部分(交换150000与145000是什么原因导致的程序在< 1秒执行):
try {
// BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("myFile.csv"));
CSVReader csvReader = new CSVReader(new InputStreamReader
(new BufferedInputStream(new FileInputStream("myFile.csv"), 8192 * 32)));
try {
int count = 0;
String[] line;
long timeStart = System.nanoTime();
while((line = csvReader.readNext()) != null){
count ++;
if(count >= 150000){
break;
}
}
long timeEnd = System.nanoTime();
System.out.println("Count: " + count);
System.out.println("Time: " + (timeEnd - timeStart) * 1.0/1000000000 + " sec");
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
System.out.println("File not found");
}
正如你所看到的,我已尝试设置一个更大的缓冲大小也是如此。我尝试过Readers
,Input Streams
等各种组合,没有什么真正有所作为。
我想知道我该怎么做?有没有办法阅读,一次说10万行,然后继续阅读下一个100K?
此外,我接受任何其他解决方案,其中不一定包含OpenCSV
库。我只是用它来简单地解析一个csv文件。
当你说'永远不会结束'......它到底是什么?死锁,内存不足等......使用调试器来查看它到底是什么,或者在循环中放入一些系统信息以查看它是否仍在处理中,但速度很慢? – Adam