gpt4 book ai didi

azure - 使用Task上传blob

转载 作者:行者123 更新时间:2023-12-02 07:32:08 26 4
gpt4 key购买 nike

背景:File upload

我的场景:我需要将大量文件上传到 Azure blob,可能是 10,000 到 100,000 个文件。每个文件大小为 10KB-50KB。

我使用了上面讨论中的解决方案,我看到文件正在快速上传,但是,我有太多文件,所以我发现我的应用程序导致 CPU 使用率非常高,总是 100%...更糟糕的是下一步我需要运行数百个进程,我的意思是我需要运行数百个进程,每个进程需要上传10,000个文件或更多。到目前为止我已经测试过了,不幸的是,我看到了很多奇怪的问题,比如异常“连接已关闭”等......

你们有什么想法可以 reduce task 的 CPU 使用率...

最佳答案

我看到的问题是,您旋转了如此多的线程,以至于您只需管理所有排队的线程即可使机器资源重载,即使从技术上讲它们不会尝试同时运行所有线程。他们将占用 RAM,在没有 RAM 的情况下,将使用 SWAP 空间 - 这将使机器陷入困境。

我将使用队列(azure队列、msmq、Systems.Collections.Queue)对所有对象进行排队,使用有限数量的线程,这些线程将使用后台链接中描述的异步方法处理文件,然后使用线程已完成执行检查队列中的下一项并处理该项。我的建议是使用非内存队列 - 我将在下面解释。主要好处是节省内存,这样您的软件就不会因为队列太大而崩溃或变慢。

Parallel.ForEach 等可以节省大量时间,但当您处理大量项目时,确实会破坏机器的性能 - 如果机器出现故障,那么您将无法从中恢复,除非您在某个地方有检查点。使用持久队列不仅可以让您正确管理机器资源,还可以让您正确管理流程中的位置。

然后,您可以使用 MSMQ 等持久队列或 Azure 队列(如果在云中)在多台计算机上进行扩展。如果您使用检查 azure 队列有多大的服务,您甚至可以不时启动实例以减少负载,然后终止额外的实例。

这是我要实现的场景:

使用标准ThreadPool大小当您检测到新文件/批处理时 - 提交到队列每次在队列中插入新项目时都会触发事件(如果是内存队列)让进程检查队列(如果是持久队列)如果队列中有新项目,首先检查 ThreadPool 中是否有空间,如果没有则忽略(使用 PEEK 方法,这样就不会删除该项目) - 如果有空间,则向 ThreadPool 添加一个工作线程进程线程(在 ThreadPool 下运行)应该执行,然后检查队列中是否有另一个项目 - 如果没有 - 线程将终止,这很好

使用此方法,您可以在 1 台计算机或 50,000 台计算机上运行此方法 - 如果您对 1 台以上的计算机使用持久队列,则不会出现任何问题。当然,如果您使用 Azure 队列,请确保正确测试重复项目,因为您可能会收到已分配给另一台计算机的排队项目。

这是一种简单的方法,可扩展,并且如果使用持久队列(甚至文件系统)可以从故障中恢复。然而,它不会通过强制机器管理具有超过 100 万个项目的线程池来滥用资源,从而使机器过载。

希望这有帮助

关于azure - 使用Task上传blob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12855626/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com