我有一个从第三方来源一次下载数千张图像的功能。每次运行的图像数量范围为2,500-250,000。你可以想象,这个过程需要一些时间,我希望尽我所能地优化。
它的工作方式是我获取一个图像路径列表,循环遍历它们并从第三方请求图像。目前,在我提出请求之前,我会检查服务器上是否已存在该图像...如果存在,则会跳过该图像...如果没有,则下载该图像。
我的问题是,如果有人知道下载前的检查是否会减慢过程(或可能加快速度)?下载文件并让它覆盖现有图像会更有效率,从而切断检查存在的步骤吗?
如果其他人有任何下载此图片的提示,欢迎他们!
答案 0 :(得分:3)
真正的答案取决于三件事:
1:您经常看到已经存在的图像的频率。您点击的次数越少,检查的有用性就越低。
2:目标存储的延迟。目标存储位置是本地还是远方?如果它在印度有300毫秒的延迟(和可能的高丢包率),相对于下载,检查会变得更加昂贵。智能线程可以显着减轻这种影响。
3:从源到目的地的带宽/吞吐量。带宽越高,两次下载文件的费用就越少。
如果您对已存在的图像的命中率低于1%,则您从检查中获得的收益并不大(最大约1%),但如果90%的图像已经存在,那么即使目标文件存储是远程/远程,也可能值得检查。无论哪种方式,它都是一种平衡行为,但如果你的命中率高到足以要求,那么查看你是否已经拥有该文件的可能性很有用。
如果您的图像没有被删除,最好的方法可能是保存已下载的图像数据库,并检查要下载的文件列表。
如果由于图像被删除/重命名或其他内容不可行,请通过线程化来最小化检查的影响。 foreach和Parallel.ForEach之间的性能差异很大。
最后,如果250k图像是大图像,那么它们可能是很多数据。发送物理媒体可能会更快(即将数据放在硬盘驱动器上并发送驱动器)。
答案 1 :(得分:1)
做一个
System.IO.File.Exists(pathName);
比下载便宜得多。因此,它可以通过避免下载时间来加快这一过程。