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