Dam*_*sic 5 java buffer file large-files opencsv
我正在尝试用 Java读取1,000,000行 CSV 文件。我正在使用 OpenCSV 库,它在30,000行的较小文件上运行良好。不到半秒即可处理完毕。但是当我尝试读取一百万行文件时,它永远不会完成。
现在我测试了一下,看看它什么时候会真正停止,通过使用我自己的二分搜索版本,我首先尝试读取500k行,然后是250k,依此类推,我发现它很容易读取145k行,在0.5- 0.7秒,而150k甚至还没有完成。
我已经彻底搜索过,找到了我在代码中使用的几种解决方案,例如 usingBufferedReader等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");
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我也尝试设置更大的缓冲区大小。我尝试了各种组合等Readers,Input Streams但没有什么真正产生影响。
我想知道我该怎么做?有没有办法一次读取 100k 行,然后继续读取下 100k 行?
另外,我对任何其他不一定包含该OpenCSV库的解决方案持开放态度。我只是使用它来简单地解析 csv 文件。
也许问题不在于 CSV 文件中的行数,而在于它的内容。也许在 145k 和 150k 之间的行中有一些数据,这会导致您的应用程序永远无法完成。
如果您从文件中复制前 145k 行并将它们粘贴到新的 CSV 文件中,直到它有 1m 行,您可以检查它。如果您的应用程序可以处理这个新文件,那么问题出在数据上,而不是行数上。