我有一大批处理,通过C#代码运行,最终部署到Azure云,我想加快速度。处理涉及大量数据。有四个数据集合,所有这些数据彼此相关,并且通常具有如下大小:
处理基本上必须遍历最大的集合,并在每个其他集合中搜索相应的记录,然后递增计数。从理论上讲,手头的任务很简单,但在集合中有很多 批次 的查找,几乎所有的时间都用在这里。在我的开发机器上,当集合达到这个大小时,该过程可能需要1-2个小时。该机器具有32 GB RAM和带有4个双核的Intel i7 3.4 GHz CPU,并且在执行期间仅达到约20%的CPU利用率。
我需要加速2分钟(或最差情况下5分钟)。鉴于数据的性质,在多个“工人”之间分配工作在概念上很容易,并且应该支持速度的提高。我的计划是将最大的集合拆分成几个较小的块并创建一些线程,以便可以更充分地利用现有硬件来实现更快的结果。我希望这会成功缩短处理时间,但我非常怀疑它是否足够。所以我正在研究拆分那个最大的集合,并且拥有多台机器,每个机器都占用了大部分工作(每个机器也都有线程)。
考虑:
这种处理的需要是间歇性的和不定期的。它通常需要在白天发生,并且可能需要每隔几小时,每隔几天或每月只进行一次。所以这些是一些重要的考虑因素:
这些注意事项让我想到了Azure功能。
我的问题:
答案 0 :(得分:3)
尽管如此,如果您需要在每个项目的持续时间较短的情况下循环使用1,000,000,那么1,000,000并不多。如果它适合一台计算机的内存(应该很容易),那么这是最好的方法。
延长@Mike的答案:
哈希查找是固定时间,因此您获得的算法具有O(n)
复杂度,其中n
是大集合的大小。
如果您尝试分配负载,您可能会获得相同的复杂性,但会乘以每个项目的网络调用时间,这比本地RAM访问速度慢。
如果达到单个服务器RAM的大小,请将最大的集合拆分为块,并将所有剩余的哈希表带到每个服务器,以使查找保持在本地。
Azure函数用于事件驱动的场景,而不是用于数据处理。
答案 1 :(得分:1)
我猜你的大部分时间花在阅读100万件物品上。 您可以使用Azure功能以弹性方式轻松地在云中托管您的代码(不支付24-7)。 如果你在这里有某种形式的并行性(理想情况下可以分割那么多),你可以为每个片段排队一条消息,让Azure函数并行运行它们。你可能是IO绑定(拉下百万行),而不是CPU绑定。
另一个想法是找到一些压缩方式来存储数百万,以便您可以快速进入它。 IE,有一个后台任务(计时器?),它扫描它并将哈希值写入你可以快速并行读取的N个大块。
答案 2 :(得分:0)
尝试哈希算法。哈希10,110项,然后检查该组中的1000000项。