我正在嘗試使用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