0

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

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

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

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

4

2 回答 2

3

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

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

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

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

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

于 2013-03-06T23:54:04.603 回答
1

做一个

  System.IO.File.Exists(pathName);

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

于 2013-03-06T23:40:34.997 回答