用Java读取大型CSV文件

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甚至还没有完成。

我已经彻底搜索过,找到了我在代码中使用的几种解决方案,例如 usingBufferedReaderBufferedInputStream,但没有一个解决了这个问题。但在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)

正如您所看到的,我也尝试设置更大的缓冲区大小。我尝试了各种组合等ReadersInput Streams但没有什么真正产生影响。

我想知道我该怎么做?有没有办法一次读取 100k 行,然后继续读取下 100k 行?

另外,我对任何其他不一定包含该OpenCSV库的解决方案持开放态度。我只是使用它来简单地解析 csv 文件。

Mar*_*fin 2

也许问题不在于 CSV 文件中的行数,而在于它的内容。也许在 145k 和 150k 之间的行中有一些数据,这会导致您的应用程序永远无法完成。

如果您从文件中复制前 145k 行并将它们粘贴到新的 CSV 文件中,直到它有 1m 行,您可以检查它。如果您的应用程序可以处理这个新文件,那么问题出在数据上,而不是行数上。