Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Azure函数是否适合拆分大型处理作业?_C#_Multithreading_Azure_Azure Functions - Fatal编程技术网

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

我有一大批处理,通过C#代码运行,并最终部署到Azure云,我想加快速度。处理涉及大量数据。共有四组数据,所有这些数据都相互关联,其大小通常如下所示:

  • 10项
  • 100项
  • 10000件
  • 100万件
处理基本上必须循环通过最大的集合,并在其他每个集合中搜索相应的记录,然后增加计数。从理论上讲,手头的任务很简单,但是在集合中有大量的查找,这几乎是花费所有时间的地方。在我的开发机器上,当集合达到这个大小时,这个过程可能需要1-2个小时。这台机器有32 GB RAM和一个Intel i7 3.4 GHz CPU,有4个双核,在执行过程中CPU利用率仅达到20%左右

我需要加速到2分钟(或最坏情况下5分钟)。考虑到数据的性质,在多个“工人”之间分割工作在概念上很容易,并且应该支持速度的提高。我的计划是将最大的集合分成几个较小的块,并创建几个线程,以便可以更充分地利用现有硬件以实现更快的结果。我希望这将成功地减少处理时间,但我高度怀疑这是否足够。因此,我正在进一步研究如何拆分这个最大的集合,让多台机器各自承担大部分工作(其中每台机器都有线程)

注意事项

对这种处理的需求是断断续续的,没有计划的。它通常需要在白天发生,可能需要每隔几个小时、几天或每月发生一次。因此,以下是一些重要的考虑因素:

  • 它的成本不会太高,所以我不能让大量的专用虚拟机全天候运行等待处理。最终解决方案必须在3个独立的数据中心实施,这一事实使情况更加复杂
  • 虽然让专用虚拟机一直运行的成本很高,但我没有太多的时间等待基础设施按需启动,因为我真的需要在2分钟内获得结果,而我对Azure的经验是,新资源的启动速度相当快,但不是几秒钟
  • 这些考虑让我想到了Azure函数

    我的问题

  • Azure函数是否适合拆分此处理?
  • Azure功能背后的基础设施是抽象的(有目的的),因此您知道硬件是否有多个核心来完全支持多线程吗?
  • Azure中是否有其他更适合此应用的替代方案?

  • 试试散列算法。散列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同意。我以一种快速而肮脏的方式构建了概念验证,只是想看看我是否能够比我所探索的其他选项更好地解决某个特定问题。那么快