Azure功能是否适合拆分大型处理作业?

时间:2017-07-19 17:48:59

标签: c# multithreading azure azure-functions

我有一大批处理,通过C#代码运行,最终部署到Azure云,我想加快速度。处理涉及大量数据。有四个数据集合,所有这些数据彼此相关,并且通常具有如下大小:

  • 10件
  • 100件
  • 10,000件物品
  • 1,000,000件

处理基本上必须遍历最大的集合,并在每个其他集合中搜索相应的记录,然后递增计数。从理论上讲,手头的任务很简单,但在集合中有很多 批次 的查找,几乎所有的时间都用在这里。在我的开发机器上,当集合达到这个大小时,该过程可能需要1-2个小时。该机器具有32 GB RAM和带有4个双核的Intel i7 3.4 GHz CPU,并且在执行期间仅达到约20%的CPU利用率。

我需要加速2分钟(或最差情况下5分钟)。鉴于数据的性质,在多个“工人”之间分配工作在概念上很容易,并且应该支持速度的提高。我的计划是将最大的集合拆分成几个较小的块并创建一些线程,以便可以更充分地利用现有硬件来实现更快的结果。我希望这会成功缩短处理时间,但我非常怀疑它是否足够。所以我正在研究拆分那个最大的集合,并且拥有多台机器,每个机器都占用了大部分工作(每个机器也都有线程)。

考虑

这种处理的需要是间歇性的和不定期的。它通常需要在白天发生,并且可能需要每隔几小时,每隔几天或每月只进行一次。所以这些是一些重要的考虑因素:

  1. 它不会成本过高,所以我不能有大量24x7全天候运行的专用VM等待处理。最终解决方案必须在3个独立的数据中心中实施,这一点更加复杂。
  2. 虽然让专用虚拟机一直运行的成本很高,但我没有太多时间等待基础设施按需启动,因为我真的需要在2分钟内获得结果,而我对Azure的体验是那样的新资源合理地快速增长,但不是秒快。
  3. 这些注意事项让我想到了Azure功能。

    我的问题

    1. Azure功能是否适合拆分此处理?
    2. Azure功能背后的基础架构是抽象的(有目的),所以你知道硬件是否有多个内核来完全支持多线程吗?
    3. Azure中是否还有其他替代方案?

3 个答案:

答案 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项。