web-dev-qa-db-ja.com

Blobコードのダウンロードは、MS Azureストレージエクスプローラーよりもはるかに遅い

サイズが1GBのblobストレージからblobをダウンロードしています。

MS Azureストレージエクスプローラーを使用すると、10分もかかりません(20メガビットのダウンラインがあります)。

ただし、コードを使用する場合:

await blobRef.DownloadToFileAsync("D:\\temp\\data.mdf", FileMode.Create);

(私もメモリストリームを使用しようとしました)250MBをダウンロードするのに1時間以上かかります(その時点でそれを殺しました)。私はこのテストを複数回行ったが、それは一貫して行われている。

また、ネットワークトラフィックも監視しました。

  • Storage Exlorerを介したネットワークトラフィックは約20メガビット
  • コードを介したネットワークトラフィックの減少は約1メガビットです

編集:私はまだ古いバージョンのAzure Storage Explorer(1.4.1)を使用しています。しかし、新しいバージョンでも同じ結果が得られることを確認できます。

14
Murdock

使用しているMS Azureストレージエクスプローラーのバージョンを指定する必要があります。

1.9.0/1.8.1/1.8.0などの新しいバージョンを使用している場合(詳細は link で確認してください)、Azure Storage Explorerは azcopy 最適なパフォーマンスのために設計された単純なコマンドを使用しています。したがって、ダウンロード/アップロードなどのパフォーマンスが向上します。

Blobのダウンロード/アップロードにコードを使用する場合、これを利用できます Microsoft Azureストレージデータ移動ライブラリ 。このライブラリは、AzCopyを強化するコアデータ移動フレームワークに基づいており、高性能のアップロード、ダウンロードも提供します。

11
Ivan Yang

最終的に、@ Ivanと@mjwillsによって提案された2つの解決策を試しました。

どちらのソリューションも、元のDownloadToFileAsyncよりはるかに高速です。 DownloadToFileParallelAsyncは、ライブラリの新しいバージョンでのみ使用できるため、インストールしたバージョンでは使用できませんでした。

6
Murdock

DownloadToFileParallelAsync を使用することをお勧めします。

ドキュメントによると:

並列リクエストを行うことにより、非同期操作を開始して、BLOBのコンテンツをファイルにダウンロードします。

そして:

ParallelIOCountおよびrangeSizeInBytesは、CPU、メモリ、および帯域幅に応じて調整する必要があります。

HEADリクエストはデータをダウンロードする前に行われるため、このAPIは大規模なダウンロードにのみ使用してください。

小さなblobの場合は、DownloadToFileAsync()を使用してください。

最高のパフォーマンスを得るには、いくつかの値を試し、スループットを測定することをお勧めします。

最初に、parallelIOCountをCPUの数に設定します。

次に、rangeSizeInBytesを調整して、parallelIOCountにrangeSizeInBytesを掛けた値が、プロセスが消費するメモリの量と等しくなるようにします。

この方法とDownloadToFileAsyncの利点は、ファイルの複数の「スライス」が並行して(同時に)ダウンロードされることです。これは、高速インターネット接続を介して大きなファイルを処理する場合に役立ちます(ほとんどの場合、4〜8倍高速になると思います)。

4
mjwills