0

サードパーティのソースから一度に何千もの画像をダウンロードする機能があります。画像の数は、1回の実行で2,500〜250,000の範囲になります。ご想像のとおり、このプロセスには時間がかかり、可能な限り最適化することを目指しています。

それが機能する方法は、画像パスのリストを取得し、それらをループして、サードパーティに画像を要求することです。現在、リクエストを行う前に、画像がサーバーにすでに存在するかどうかを確認します。存在する場合は、その画像をスキップします。存在しない場合は、ダウンロードします。

私の質問は、ダウンロード前のチェックがプロセスを遅くしている(またはおそらくスピードアップしている)かどうかを誰かが知っているかどうかです。ファイルをダウンロードして既存の画像を上書きし、存在を確認する手順を省く方が効率的でしょうか。

このボリュームの画像をダウンロードするためのヒントが他にある場合は、大歓迎です。

4

2 に答える 2

3

本当の答えは3つのことに依存します:
1:すでに存在する画像に出くわす頻度。ヒットする頻度が少ないほど、チェックの有用性は低くなります。2:宛先ストレージのレイテンシー。宛先の保管場所はローカルですか、それとも遠くですか?インドに300msの遅延がある場合(およびパケット損失が高い可能性がある場合)、チェックはダウンロードに比べて高価になります。これは、スマートスレッドによって大幅に軽減されます。3:送信元から宛先までの帯域幅/スループット。帯域幅が広いほど、ファイルのダウンロードにかかるコストが2倍少なくなります。

すでに存在する画像のヒット率が1%未満の場合、チェックによるメリットはあまり得られません(最大〜1%)が、画像の90%がすでに存在する場合は、おそらく次のようになります。宛先ファイルストアがリモート/遠くにある場合でも、チェックする価値があります。いずれにせよ、それはバランスをとる行為ですが、あなたが尋ねるのに十分高いヒット率を持っているなら、あなたがすでにファイルを持っているかどうかをチェックすることは役に立つでしょう。

まだ削除していない画像の場合、これを行う最善の方法は、ダウンロードした画像のデータベースを保持し、ダウンロードするファイルのリストをそのデータベースと照合することです。

画像が削除されたり名前が変更されたりするなどの理由でそれが不可能な場合は、スレッド化してチェックの影響を最小限に抑えてください。レイテンシが高い操作のforeachとParallel.ForEachのパフォーマンスの違いは非常に大きいです。

最後に、25万枚の画像は、大きな画像の場合、大量のデータになる可能性があります。物理メディアを送信する方が速い場合があります(つまり、データをハードドライブに置いて、ドライブを送信します)。

于 2013-03-06T23:54:04.603 に答える
1

を行う

  System.IO.File.Exists(pathName);

ダウンロードよりもはるかに安価です。したがって、ダウンロードを実行する時間を回避することにより、プロセスをスピードアップします。

于 2013-03-06T23:40:34.997 に答える