我正在开发一个项目,他们在CSV文件中共享所有数据,为了快速读取我们使用OpenCSV的CSV数据,这可以正常工作直到极限但是当我有4GB或更大的CSV时,需要时间&许多次崩溃。 对于更快的CSV读取器lib或代码还有其他方法吗?
答案 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)
什么阻止你这样做。
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
}
您还可以查看Apache Spark。这似乎是一个很好的用例。
您还可以使用Executor Framework在单独的线程中处理每一行。