gpt4 book ai didi

java - 用 Java 读取 CSV 文件的最快方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:36:39 60 4
gpt4 key购买 nike

我注意到使用 java.util.Scanner读取大文件(在我的例子中是 CSV 文件)时非常慢。

我想改变我目前读取文件的方式,以提高性能。以下是我目前所拥有的。请注意,我正在为 Android 开发:

InputStreamReader inputStreamReader;
try {
inputStreamReader = new InputStreamReader(context.getAssets().open("MyFile.csv"));
Scanner inputStream = new Scanner(inputStreamReader);
inputStream.nextLine(); // Ignores the first line
while (inputStream.hasNext()) {
String data = inputStream.nextLine(); // Gets a whole line
String[] line = data.split(","); // Splits the line up into a string array

if (line.length > 1) {
// Do stuff, e.g:
String value = line[1];
}
}
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}

使用 Traceview ,我设法发现主要的性能问题,具体是:java.util.Scanner.nextLine()java.util.Scanner.hasNext() .

我查看了其他问题(例如 this one ),并且遇到了一些 CSV 阅读器,例如 Apache Commons CSV ,但他们似乎没有太多关于如何使用它们的信息,而且我不确定它们会快多少。

我也听说过使用 FileReaderBufferedReader在类似 this one 的回答中, 但同样,我不知道改进是否会很重要。

我的文件大约有 30,000 行,使用我目前(上面)的代码,从大约 600 行开始读取值至少需要 1 分钟,所以我没有计算需要多长时间读取 2,000 多行以下的值,但有时,在读取信息时,Android 应用会变得无响应并崩溃。

虽然我可以简单地更改部分代码并亲自查看,但我想知道是否有任何我没有提到的更快的替代方案,或者我是否应该只使用 FileReaderBufferedReader .将大文件拆分成较小的文件,并根据我要检索的信息选择读取哪个文件会更快吗?最好,我还想知道为什么最快的方法是最快的(即是什么让它变得快)。

最佳答案

uniVocity-parsers拥有您能找到的最快的 CSV 解析器(比 OpenCSV 快 2 倍,比 Apache Commons CSV 快 3 倍),具有许多独特的功能。

这里有一个关于如何使用它的简单示例:

CsvParserSettings settings = new CsvParserSettings(); // many options here, have a look at the tutorial

CsvParser parser = new CsvParser(settings);

// parses all rows in one go
List<String[]> allRows = parser.parseAll(new FileReader(new File("your/file.csv")));

为了加快这个过程,您可以选择您感兴趣的列:

parserSettings.selectFields("Column X", "Column A", "Column Y");

通常情况下,您应该能够在 2 秒左右解析 400 万行。通过列选择,速度将提高大约 30%。

如果使用 RowProcessor 会更快.有许多开箱即用的实现来处理对象、POJOS 等的转换。文档解释了所有可用的功能。它是这样工作的:

// let's get the values of all columns using a column processor
ColumnProcessor rowProcessor = new ColumnProcessor();
parserSettings.setRowProcessor(rowProcessor);

//the parse() method will submit all rows to the row processor
parser.parse(new FileReader(new File("/examples/example.csv")));

//get the result from your row processor:
Map<String, List<String>> columnValues = rowProcessor.getColumnValuesAsMapOfNames();

我们还构建了一个简单的速度比较项目here .

关于java - 用 Java 读取 CSV 文件的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31081578/

60 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com