我有多个FileMap
个对象存储在List<FileMap>
中,当前大约有500,000个对象。
我使用Predicates使用parallelStream过滤List。
我现在正在阅读文档,看到有一个名为Collectors.toConcurrentMap()
的函数。我熟悉ConcurrentHashMap
并且知道它更快,因为多个线程划分了地图。
将简单的ArrayList
更改为toConcurrentMap
,然后使用带有parallelStream的谓词更快地工作?
目前如果我在该List上使用parallelStream并使用serialStream,它的工作速度相同。
答案 0 :(得分:1)
Map是key-value
对的集合,其中键是唯一的。您拥有的数据不是地图,而是列表。有很多问题:
ConcurrentMap
具有额外的复杂性以确保线程安全 - 尽管它以更智能的方式完成,而不仅仅是使所有方法同步,它仍会影响性能。过滤列表元素可以大量(并且容易)并行化。拥有n
核心,其中n
是列表的长度,您可以获得与log(n)
一样好的性能 - 这当然是使用专门的并行算法并使用图形卡而不是CPU,虽然这些功能虽然不那么强大,却拥有数千个核心。
我在一个包含1亿个整数的列表上运行了一些测试并按顺序处理大约700毫秒,使用并行流 - 大约350毫秒(我猜Java只使用了2个线程),同时尝试将列表转换为{{1几分钟后抛出内存错误。
您提到使用ConcurrentMap
和stream()
并未改变效果。我建议调查Java如何选择在并行流中使用多少线程(以及如何更改)。这也受到资源的影响 - 运行更多CPU消耗的线程比CPU中的内核数量会因上下文切换而降低性能。我建议只使用与你拥有的核心数量一样多的线程或者少一个 - 这样一个核心就可以用于所有其他操作系统工作。