C# Azure函数是否适合拆分大型处理作业?
我有一大批处理,通过C#代码运行,并最终部署到Azure云,我想加快速度。处理涉及大量数据。共有四组数据,所有这些数据都相互关联,其大小通常如下所示:C# Azure函数是否适合拆分大型处理作业?,c#,multithreading,azure,azure-functions,C#,Multithreading,Azure,Azure Functions,我有一大批处理,通过C#代码运行,并最终部署到Azure云,我想加快速度。处理涉及大量数据。共有四组数据,所有这些数据都相互关联,其大小通常如下所示: 10项 100项 10000件 100万件 处理基本上必须循环通过最大的集合,并在其他每个集合中搜索相应的记录,然后增加计数。从理论上讲,手头的任务很简单,但是在集合中有大量的查找,这几乎是花费所有时间的地方。在我的开发机器上,当集合达到这个大小时,这个过程可能需要1-2个小时。这台机器有32 GB RAM和一个Intel i7 3.4 GH
- 10项
- 100项
- 10000件
- 100万件
试试散列算法。散列10110项,然后检查集合中的1000000项。恕我直言,如果您只需要循环一次,每个项的时间总是很短,那么1000000项并不多。如果它能放进一台计算机的内存中(应该很容易),那么这是最好的方法 要扩展@Mike的答案:
- 将所有数据存储在内存中
- 根据查找键对较小的集合进行散列
- 遍历最大的集合并对每个项进行查找
O(n)
复杂性,其中n
是大集合的大小
如果您尝试分配负载,可能会得到相同的复杂性,但会乘以每个项目的网络调用时间,这比本地RAM访问慢得多
如果您的数据量超过了单个服务器的RAM,请将最大的集合分割成块,并将所有剩余的哈希表带到每个服务器上,以保持本地查找
Azure函数用于事件驱动的场景,而不是真正用于数据处理。我猜您的大部分时间都花在阅读100万项上。 您可以使用Azure功能轻松地以弹性方式在云中托管代码(无需24-7天付费)。 如果您在这里有某种形式的并行性(理想的情况是将这一百万条消息分开),您可以为每个片段排队一条消息,并让Azure函数并行运行它们。您可能受IO限制(减少了数百万行),而不是CPU限制
另一个想法是找到一些压缩的方法来存储这一百万,这样你就可以快速进入它。也就是说,有一个后台任务(计时器?)可以扫描它,并将散列写入N个大blob中,您可以快速并行读取 只是出于好奇,如果不受CPU限制,那么大部分工作会发生在哪里?在处理过程中,您是否进行了大量磁盘I/O(如DB)或网络调用?我无法想象一个循环的100万次迭代需要几个小时才能运行这样琐碎的事情…@JesseCarter这是件奇怪的事情,除了内存中数据的处理之外,没有任何事情在进行。没有磁盘或网络。在发布我的问题之前,我知道我真的需要优化我的搜索算法,但我没有足够的信心相信它会足够好,所以我认为我仍然会来到这里,需要看看这个选项。它实现了“快速和肮脏”作为概念的证明,但我在仔细思考并阅读了到目前为止提出的答案后发现,在我走这条路之前,我需要改进搜索算法。我非常有兴趣看到更多的实现,我觉得这应该可以在几分钟或更短的时间内在一台机器上运行。相对而言,我们谈论的不是大数据集here@JesseCarter同意。我以一种快速而肮脏的方式构建了概念验证,只是想看看我是否能够比我所探索的其他选项更好地解决某个特定问题。那么快