【问题标题】:Quick load data from CSV to List [Java]将数据从 CSV 快速加载到列表 [Java]
【发布时间】:2016-01-10 17:54:51
【问题描述】:

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

ID | property1 | property2 | property3 | property4

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

【问题讨论】:

  • 欢迎来到 Stack Overflow!您的问题非常广泛,如果您提供一个最小的示例并询问有关它的具体问题,例如瓶颈可能在哪里,或者如何完成您想做的特定事情,可能会更清楚。请尝试使您的问题更具体。祝你好运!

标签: java csv arraylist


【解决方案1】:

我建议您将文件读入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

【讨论】:

  • 谢谢,我尝试这样做。我认为大部分时间都花在创建新 ID_Object 的新实例上(我认为要创建大约 60.000 个对象,其余的是这个 ID 的属性)。 ID 是一个类,属性可以是字符串,所以当我在循环中创建对象时,最多需要 6 分钟!
  • @caesar_ 尝试使用并行流。如果你的内核比我多,这会有所帮助。
  • 非常感谢彼得,我会努力的,如果我能做到这一点,我会告诉你
猜你喜欢
  • 2016-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-29
  • 1970-01-01
相关资源
最近更新 更多