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