假设我想读取一个巨大的文件,其中每行表示域对象,我需要将这些信息存储在缓存中。使用多个线程读取此文件。每个线程正在读取一定范围的行,它们将把Map的对象放入列表中。当所有提交的任务完成后,您应该有一个包含文件中所有对象的完整列表。 CopyOnWriteArrayList
我不能使用,因为它在每次写入时都会创建副本,所以加载会占用太多内存 ArrayList
:我可以使用新的 ArrayList
对于每个任务,将任务读取的对象插入其本地 Araylist
并将其作为 Future
. 当所有任务完成后,我将合并所有 ArrayList
对一个。这里没有 ArrayList
等于我创建的任务数。
有更好的方法吗 List
可用于存储对象的数据结构?
3条答案
按热度按时间gcxthw6b1#
不是真的。你的arraylist策略是尽可能好的,例如,相当于什么
parallelStream().collect(toList())
做。vltsax252#
copyonwritearraylist可能不是此方案的正确候选
给定的用例似乎写得很重(只写后跟只读)
CopyOnWriteArrayList
在任何给定的时间通常只允许一个编写器(尽管可以并发执行读卡器)在场景中,使用
CopyOnWriteArrayList
性能可能比synchronizedList
或者Vector
. 参考so:synchronizedlist对于当前用例,正如@louis wasserman所指出的,最好在每个线程中填充独立列表,然后最终合并这些列表。
由于重新分配,组合步骤可能会耗费时间/空间。
通过使用单个列表的组合大小初始化结果列表,可以稍微优化时间/空间(避免在内部调整结果的大小)
nwo49xxi3#
您可以使用guava cache/caffine,因为巨大的文件将产生更多的gc。