用于读取文件和存储对象的并发List数据结构

Concurrent List data structure for reading file and storing objects

假设我想读取每一行代表域对象的巨大文件,我需要将这些信息存储在缓存中。使用多个线程读取此文件。 每个线程都在读取一定范围的行,它们会将映射的对象放入列表中。最后,当所有提交的任务都完成时,您应该拥有包含文件中所有对象的完整列表。

  1. CopyOnWriteArrayList 我无法使用,因为它会在每次写入时创建副本 所以负载会占用太多内存 ArrayList :我可以使用 new
  2. ArrayList 为每个任务插入任务读取的对象 本地 Araylist 和 return 为 Future。当所有任务完成后,我 将所有 ArrayList 合并为一个。这里没有 ArrayList 等于 我创建的任务数。

是否有更好的并发 List 数据结构可用于存储对象?

不是真的。您的 ArrayList 策略尽善尽美,例如相当于 parallelStream().collect(toList()) 所做的。

CopyOnWriteArrayList 可能不适合这种情况

  1. 给定的用例似乎很重写(只写后只读)
  2. CopyOnWriteArrayList 通常可能在任何给定时间只允许一个写入者(尽管读取者可以同时执行)

在这种情况下,使用 CopyOnWriteArrayList 的性能可能比 synchronizedListVector 差。

对于当前的用例,正如@Louis Wasserman 所指出的,最好在每个线程中填充隔离列表,然后最终组合这些列表。

  1. 组合步骤可能 time/space 由于重新分配而消耗大量资源。
  2. 可以针对 time/space 进行稍微优化,方法是使用单个列表的组合大小初始化结果列表(避免在内部调整结果大小)

你可以使用 guava cache/caffine,因为大文件会产生更多的 gc。