Загрузка Blob-кода значительно медленнее, чем в MS Azure Storage Explorer.
Я загружаю BLOB-объект из хранилища BLOB-объектов размером 1 ГБ.
Если я использую обозреватель хранилищ MS Azure, это займет не более 10 минут (у меня 20 мегабитных строк).
Однако, когда я использую код:
await blobRef.DownloadToFileAsync("D:\\temp\\data.mdf", FileMode.Create);
(я также пытался использовать поток в памяти) для загрузки 250 МБ требуется более часа (в этот момент я его убил). Я сделал этот тест несколько раз, и это происходит последовательно.
Я также контролировал сетевой трафик.
- Через Storage Exlorer объем сетевого трафика составляет около 20 мегабит
- Через код нисходящий трафик сети составляет около 1 мегабита
ОБНОВЛЕНИЕ: я все еще использую старую версию Azure Storage Explorer (1.4.1). Но я могу подтвердить, что новые версии также дают такие же результаты.
Ответы
Ответ 1
Вы должны указать, какую версию MS Azure Storage Explorer вы используете.
Если вы используете более новые версии 1.9.0/1.8.1/1.8.0 и т.д. (Подробности см. в этой ссылке), то Azure Storage Explorer интегрирован с azcopy который использует простые команды, предназначенные для оптимальной производительности. Таким образом, вы можете иметь хорошую производительность для загрузки/выгрузки и т.д.
При использовании кода для загрузки/выгрузки больших двоичных объектов вы можете использовать эту библиотеку перемещения данных хранилища Microsoft Azure. Эта библиотека основана на базовой структуре перемещения данных, которая поддерживает AzCopy, что также обеспечивает высокопроизводительную загрузку и выгрузку.
Ответ 2
В конце концов я попробовал 2 решения, предложенных @Ivan и @mjwills:
Оба решения намного быстрее оригинального DownloadToFileAsync. DownloadToFileParallelAsync доступен только в более поздних версиях библиотеки и, следовательно, не был доступен в той, которую я установил.
Ответ 3
Я бы предложил использовать DownloadToFileParallelAsync
.
Согласно документам:
Инициирует асинхронную операцию для загрузки содержимого BLOB-объекта. в файл, делая параллельные запросы.
и:
Параллельные IOCount и rangeSizeInBytes должны быть настроены в зависимости на процессоре, памяти и пропускной способности.
Этот API должен использоваться только для больших загрузок, так как запрос HEAD сделано до загрузки данных.
Для небольших объектов используйте функцию DownloadToFileAsync().
Чтобы получить лучшую производительность, рекомендуется попробовать несколько значений, и измерьте пропускную способность.
Одним из мест, с которого можно начать, было бы установить для параметра parallelIOCount значение процессоров.
Затем отрегулируйте rangeSizeInBytes так, чтобы параллельные времена IOCount rangeSizeInBytes равен объему памяти, которую вы хотите, чтобы процесс потребляют.
Преимущество этого метода по сравнению с DownloadToFileAsync
заключается в том, что несколько "кусочков" файла загружаются параллельно (одновременно). Это может быть полезно для больших файлов при быстром интернет-соединении (в большинстве случаев я ожидаю, что это будет в 4-8 раз быстрее).