簡體   English   中英

下載數千張圖像時的性能

[英]Performance when downloading thousands of images

我有一個功能,可以從第三方來源一次下載數千張圖像。 每次運行的圖像數量范圍為2500至250,000。 可以想象,此過程需要一些時間,並且正在盡力優化。

它的工作方式是我獲取圖像路徑列表,循環遍歷它們,並從第三方請求圖像。 當前,在我發出請求之前,我會檢查服務器上是否已經存在該映像...如果存在,它將跳過該映像...如果不存在,則將其下載。

我的問題是,是否有人知道下載之前的檢查是否在減慢進程(或可能加快進程)? 下載文件並讓它覆蓋已經存在的圖像會更有效,從而省去了檢查是否存在的步驟嗎?

如果其他人有下載此數量圖像的提示,歡迎使用!

真正的答案取決於三件事:
1:您多久遇到一次已經存在的圖像。 命中次數越少,檢查就越有用。 2:目標存儲的延遲。 目標存儲位置在本地還是很遠? 如果它在印度具有300毫秒的延遲(並且可能會丟失大量數據包),則相對於下載而言,檢查將變得更加昂貴。 智能線程可以大大緩解這一問題。 3:從源到目的地的帶寬/吞吐量。 帶寬越高,兩次下載文件的費用就越少。

如果您已經存在的圖像的命中率低於1%,則檢查不會帶來太大的收益(最大〜1%),但是如果90%的圖像已經存在,則可能是即使目標文件存儲位於遠程/遙遠也值得檢查。 無論哪種方式,它都是一種平衡的行為,但是,如果您的命中率足夠高,可以進行詢問,那么檢查一下您是否已經擁有該文件將很有用。

如果尚未刪除圖像,則最好的方法可能是保留已下載圖像的數據庫,並對照該數據庫檢查要下載的文件列表。

如果由於圖像被刪除/重命名或其他原因而不可行,請通過對圖像進行線程化來最大程度地減少檢查的影響。 foreach和Parallel.ForEach在高延遲操作方面的性能差異很大。

最后,如果25萬張圖像是大圖像,它們可能是很多數據。 發送物理介質(即,將數據放入硬盤驅動器並發送驅動器)可能更快。

做一個

  System.IO.File.Exists(pathName);

比下載便宜很多。 因此,它可以避免時間來加快下載速度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM