首页 > 解决方案 > 哈希集的简单并行化

问题描述

我有 2 个循环(嵌套),试图做一个简单的并行化

伪代码

for item1 in data1 (~100 million row)
    for item2 in data2 (~100 rows)
        result = process(item1,item2) // couple of if conditions
        hashset.add(result) // while adding, incase of a duplicate i also decide wihch one to retain

process(item1,item2)准确地说,如果条件基于 item1 和 item2 中的值,则为 4。(所用时间小于 50 毫秒)

data1大小为 Nx17
data2大小为 Nx17
result大小为 1x17 (结果在添加到哈希集中之前加入字符串)

最大输出大小:未知,但我希望为至少 5 亿个做好准备,这意味着哈希集将包含 5 亿个项目。(我猜如何处理哈希集中的这么多数据将是另一个问题)

我应该只使用 aconcurrent hashset使其线程安全并使用parallel.each还是应该使用TASK概念

请根据您的意见提供一些代码示例。

标签: c#task-parallel-libraryhashsetparallel.foreach

解决方案


答案很大程度上取决于process(data1, data2). 如果这是一个 CPU 密集型操作,那么您肯定可以从Parallel.ForEach. 当然,您应该使用并发字典,或者锁定您的哈希表。您应该进行基准测试以查看最适合您的方法。如果process对性能的影响太小,那么你可能不会从并行化中得到任何东西——哈希表上的锁定会杀死它。

您还应该尝试查看在外循环上枚举 data2 是否也更快。它可能会给您带来另一个好处 - 您可以为每个 data2 实例创建一个单独的哈希表,然后将结果合并到一个哈希表中。这将避免锁定。

同样,您需要进行测试,这里没有通用的答案。


推荐阅读