【问题标题】:Performance when downloading thousands of images下载数千张图像时的性能
【发布时间】:2013-03-06 23:36:06
【问题描述】:

我有一个从第三方来源一次下载数千张图片的功能。每次运行的图像数量范围为 2,500-250,000。正如您可以想象的那样,此过程需要一些时间,并且我希望尽我所能进行优化。

它的工作方式是获取图像路径列表,循环遍历它们并从第 3 方请求图像。目前,在我发出请求之前,我会检查图像是否已经存在于服务器上...如果存在,它会跳过该图像...如果不存在,它会下载它。

我的问题是,是否有人知道下载前的检查是否会减慢进程(或可能加快进程)?下载文件并让它覆盖已经存在的图像会更有效,从而减少检查存在的步骤吗?

如果其他人有任何下载此卷图像的提示,欢迎他们!

【问题讨论】:

  • 如果您按顺序执行这些操作,那么是的,检查会减慢速度。但可能不会很多。
  • 这听起来像是你可以通过运行进程一次检查和一次不检查来测试的东西。不过,我猜测本地文件系统访问比网络访问要快。因此,跳过文件将弥补检查文件时的任何损失。
  • 一定要异步实现这个功能。您还可以从并行运行任务中受益。
  • 虽然存储访问通常不是那么快,但您实际上可以比来自不同服务器的映像更快地访问硬盘。所以,是的,显然在下载之前检查你是否真的需要下载它会有所帮助。此外,您不应该有那么多并发下载。将文件放入队列中,一次处理 5 个。

标签: c# asp.net image stream


【解决方案1】:

真正的答案取决于三件事:
1:您遇到已经存在的图像的频率。击中的次数越少,检查的用处就越少。 2:目标存储的延迟。目标存储位置是本地还是远方?如果它在印度,延迟为 300 毫秒(并且可能丢包率很高),则相对于下载而言,检查变得更加昂贵。智能线程可以显着缓解这种情况。 3:从源到目的地的带宽/吞吐量。您的带宽越高,两次下载文件的成本就越少。

如果您对已经存在的图像的命中率低于 1%,则您不会从检查中获得太多收益(最大约 1%),但如果 90% 的图像已经存在,它会即使目标文件存储在远程/很远,也可能值得检查。无论哪种方式,这都是一种平衡行为,但如果您有足够高的命中率来询问,那么检查您是否已经拥有该文件可能会很有用。

如果您已经拥有的图像没有被删除,那么最好的方法可能是保留一个已下载图像的数据库,并根据该数据库检查要下载的文件列表。

如果这不可行,因为图像被删除/重命名或其他原因,请通过线程化检查来最大程度地减少检查的影响。对于高延迟的操作,foreach 和 Parallel.ForEach 之间的性能差异是巨大的。

最后,如果 250k 图像是大图像,它们可能是大量数据。发送物理媒体(即将数据放在硬盘驱动器上并发送驱动器)可能会更快。

【讨论】:

  • 感谢您的详尽回答。我想我会根据您的回答和其他人提供的答案继续检查。
【解决方案2】:

做一个

  System.IO.File.Exists(pathName);

比下载便宜很多。因此,它会通过避免下载时间来加快进程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2012-06-03
    • 2011-09-21
    相关资源
    最近更新 更多