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

q9yhzks0  于 2021-07-12  发布在  Java
关注(0)|答案(3)|浏览(270)

假设我想读取一个巨大的文件,其中每行表示域对象,我需要将这些信息存储在缓存中。使用多个线程读取此文件。每个线程正在读取一定范围的行,它们将把Map的对象放入列表中。当所有提交的任务完成后,您应该有一个包含文件中所有对象的完整列表。 CopyOnWriteArrayList 我不能使用,因为它在每次写入时都会创建副本,所以加载会占用太多内存 ArrayList :我可以使用新的 ArrayList 对于每个任务,将任务读取的对象插入其本地 Araylist 并将其作为 Future . 当所有任务完成后,我将合并所有 ArrayList 对一个。这里没有 ArrayList 等于我创建的任务数。
有更好的方法吗 List 可用于存储对象的数据结构?

gcxthw6b

gcxthw6b1#

不是真的。你的arraylist策略是尽可能好的,例如,相当于什么 parallelStream().collect(toList()) 做。

vltsax25

vltsax252#

copyonwritearraylist可能不是此方案的正确候选

给定的用例似乎写得很重(只写后跟只读) CopyOnWriteArrayList 在任何给定的时间通常只允许一个编写器(尽管可以并发执行读卡器)
在场景中,使用 CopyOnWriteArrayList 性能可能比 synchronizedList 或者 Vector . 参考so:synchronizedlist
对于当前用例,正如@louis wasserman所指出的,最好在每个线程中填充独立列表,然后最终合并这些列表。
由于重新分配,组合步骤可能会耗费时间/空间。
通过使用单个列表的组合大小初始化结果列表,可以稍微优化时间/空间(避免在内部调整结果的大小)

nwo49xxi

nwo49xxi3#

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

相关问题