将数据从CSV快速加载到列表[Java]

时间:2016-01-10 17:54:52

标签: java csv arraylist

我有约。 CSV文件中几列中的500.000条记录。

ID | property1 | property2 | property3 | property4

我需要将此数据加载到Object的ArrayList中。 ID不是唯一的。每个新ID都需要新的类ID实例,其余是不同类Foo的实例。 当我读取CSV并找到已经发生的ID时,我需要类ID的实例。最快的方法是什么?我尝试使用HashSet或HashMap(然后在List中搜索大约需要5分钟)和lambda表达式(约6分钟)。我无法使用数据库。

1 个答案:

答案 0 :(得分:2)

我建议您将文件读入Map<String, List<String[]>>大部分时间都会花费创建字符串进行记录。

根据每条线的长度,读取时间不应超过几秒,查找次数将小于秒。

您可以记录每一行的起始位置,并在实际需要时解析它们。

以下是使用Stream的示例。

PrintWriter pw = new PrintWriter("file.txt");
for (int i = 0; i < 500000; i++)
    pw.println("ID" + i / 2 + " | property1 | property2 | property3 | property4");
pw.close();

long start = System.currentTimeMillis();
Pattern BAR = Pattern.compile(" *[|] *");
Map<String, List<String[]>> collect = Files.lines(Paths.get("file.txt"))
        .map(line -> BAR.split(line))
        .collect(Collectors.groupingBy(l -> l[0]));
long time = System.currentTimeMillis() - start;
System.out.println("Took "+time/1e3+" seconds");

打印

Took 4.028 seconds

这是在超级书上运行。

同时运行加速一点

long start = System.currentTimeMillis();
Pattern BAR = Pattern.compile(" *[|] *");
Map<String, List<String[]>> collect = Files.lines(Paths.get("file.txt"))
        .parallel()
        .map(line -> BAR.split(line))
        .collect(Collectors.groupingByConcurrent(l -> l[0]));
long time = System.currentTimeMillis() - start;
System.out.println("Took "+time/1e3+" seconds");

打印

Took 2.589 seconds