サイズが1GBのblobストレージからblobをダウンロードしています。
MS Azureストレージエクスプローラーを使用すると、10分もかかりません(20メガビットのダウンラインがあります)。
ただし、コードを使用する場合:
await blobRef.DownloadToFileAsync("D:\\temp\\data.mdf", FileMode.Create);
(私もメモリストリームを使用しようとしました)250MBをダウンロードするのに1時間以上かかります(その時点でそれを殺しました)。私はこのテストを複数回行ったが、それは一貫して行われている。
また、ネットワークトラフィックも監視しました。
編集:私はまだ古いバージョンのAzure Storage Explorer(1.4.1)を使用しています。しかし、新しいバージョンでも同じ結果が得られることを確認できます。
使用しているMS Azureストレージエクスプローラーのバージョンを指定する必要があります。
1.9.0/1.8.1/1.8.0などの新しいバージョンを使用している場合(詳細は link で確認してください)、Azure Storage Explorerは azcopy 最適なパフォーマンスのために設計された単純なコマンドを使用しています。したがって、ダウンロード/アップロードなどのパフォーマンスが向上します。
Blobのダウンロード/アップロードにコードを使用する場合、これを利用できます Microsoft Azureストレージデータ移動ライブラリ 。このライブラリは、AzCopyを強化するコアデータ移動フレームワークに基づいており、高性能のアップロード、ダウンロードも提供します。
最終的に、@ Ivanと@mjwillsによって提案された2つの解決策を試しました。
どちらのソリューションも、元のDownloadToFileAsyncよりはるかに高速です。 DownloadToFileParallelAsyncは、ライブラリの新しいバージョンでのみ使用できるため、インストールしたバージョンでは使用できませんでした。
DownloadToFileParallelAsync
を使用することをお勧めします。
ドキュメントによると:
並列リクエストを行うことにより、非同期操作を開始して、BLOBのコンテンツをファイルにダウンロードします。
そして:
ParallelIOCountおよびrangeSizeInBytesは、CPU、メモリ、および帯域幅に応じて調整する必要があります。
HEADリクエストはデータをダウンロードする前に行われるため、このAPIは大規模なダウンロードにのみ使用してください。
小さなblobの場合は、DownloadToFileAsync()を使用してください。
最高のパフォーマンスを得るには、いくつかの値を試し、スループットを測定することをお勧めします。
最初に、parallelIOCountをCPUの数に設定します。
次に、rangeSizeInBytesを調整して、parallelIOCountにrangeSizeInBytesを掛けた値が、プロセスが消費するメモリの量と等しくなるようにします。
この方法とDownloadToFileAsync
の利点は、ファイルの複数の「スライス」が並行して(同時に)ダウンロードされることです。これは、高速インターネット接続を介して大きなファイルを処理する場合に役立ちます(ほとんどの場合、4〜8倍高速になると思います)。