读取4GB或更大的CSV大小

时间:2018-04-05 07:33:49

标签: java csv jar

我正在开发一个项目,他们在CSV文件中共享所有数据,为了快速读取我们使用OpenCSV的CSV数据,这可以正常工作直到极限但是当我有4GB或更大的CSV时,需要时间&许多次崩溃。 对于更快的CSV读取器lib或代码还有其他方法吗?

2 个答案:

答案 0 :(得分:1)

This comparison应该可以让您更好地了解哪些解析器在那里以及它们的速度有多快。

在您的情况下,您的程序可能会变慢,因为您正在收集List中的所有行或类似的东西。如果你能提供帮助,这并不是一个好主意。

使用univocity-parsers你可以尝试这样的事情:

CsvParserSettings settings = new CsvParserSettings();
settings.detectFormatAutomatically(); // or configure the format manually as required

CsvParser parser = new CsvParser(settings);
for(String[] row : parser.iterate(new File("/path/to/your.csv"), "UTF-8")){
    // your code here
}

如果您正在进行转换和操作,则可以改为使用Record

for(Record record : parser.iterateRecords(new File("/path/to/your.csv"), "UTF-8")){
    Long someLongValue = record.getLong("someColumnName");
    BigDecimal someBigDecimalValue = record.getBigDecimal("anotherColumnName");
    // ... etc
}

无论哪种方式,您都应该能够在几秒钟内处理您的文件。

确保您没有将所有行存储在内存中。您可以使用此库来读取100TB的文件,只需100MB的内存,但如果您开始在列表中存储内容,垃圾收集器将启动并减慢您尝试释放内存以避免OutOfMemoryError的速度。如果您确实需要将所有内容都放在内存中,请使用-Xms8G -Xmx8G或适合您案例的内容。

希望这有帮助。

免责声明,我是univocity-parsers的作者 - 它的开源和免费(Apache 2.0许可证)

答案 1 :(得分:0)

  1. 什么阻止你这样做。

    public void readCsv(final String fileName) throws IOException {
    
    FileInputStream fileInputStream = new FileInputStream(new File(fileName));
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream));
    String strLine;
    while ((strLine = bufferedReader.readLine()) != null) {
    processLine(strLine);
    }
    bufferedReader.close();
    }
    
    
    private void processLine(final String line) {
    // your code here
    }
    
  2. 您还可以查看Apache Spark。这似乎是一个很好的用例。

  3. 您还可以使用Executor Framework在单独的线程中处理每一行。