微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决用于读取文件和存储对象的并发列表数据结构

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

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

有没有更好的并发 List 数据结构可以用来存储对象?

解决方法

不是真的。您的 ArrayList 策略与它所获得的一样好,例如相当于 parallelStream().collect(toList()) 的作用。

,

CopyOnWriteArrayList 可能不是这种情况的正确候选

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

在场景中,使用 CopyOnWriteArrayList 的性能可能比 synchronizedListVector 差。 Ref SO: synchronizedList

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

  1. 由于重新分配,组合步骤可能会耗费时间/空间。
  2. 可以通过使用单个列表的组合大小初始化结果列表来稍微优化时间/空间(避免在内部调整结果大小)
,

你可以使用番石榴缓存/咖啡因,因为大文件会产生更多的gc。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。