c# - 哈希集的简单并行化
问题描述
我有 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
概念
请根据您的意见提供一些代码示例。
解决方案
答案很大程度上取决于process(data1, data2)
. 如果这是一个 CPU 密集型操作,那么您肯定可以从Parallel.ForEach
. 当然,您应该使用并发字典,或者锁定您的哈希表。您应该进行基准测试以查看最适合您的方法。如果process
对性能的影响太小,那么你可能不会从并行化中得到任何东西——哈希表上的锁定会杀死它。
您还应该尝试查看在外循环上枚举 data2 是否也更快。它可能会给您带来另一个好处 - 您可以为每个 data2 实例创建一个单独的哈希表,然后将结果合并到一个哈希表中。这将避免锁定。
同样,您需要进行测试,这里没有通用的答案。
推荐阅读
- node.js - 需要有关 nodejs 宁静任务的帮助
- spring-webflux - 如何在返回 Flux 的反应器调用序列中传递属性
- oracle - ora-01882:使用 Kafka Connect JdbcSource 连接器未找到时区区域
- python - 如何安装mysql客户端?
- ruby - 将 Rails 4.0.0 升级到 4.0.x (4.0.13) 时出现问题 - ActionDispatch::Assertions:Module (NoMethodError) 调用了私有方法“include”
- php - 使用递归的动态菜单树并从其他四个 mysql 表中获取信息
- javascript - 摩卡测试——完全“之前”完成,然后运行“它”
- react-native - 在云上排队由 React-Native 应用程序进行的 TCP/UDP 调用
- javascript - 为什么我不能在 v3 中将普通变量转换为 jQuery 对象?
- python - python matplotlib中的4D绘图