web-dev-qa-db-fra.com

Téléchargement de code blob beaucoup plus lent que MS Azure Storage Explorer

Je télécharge un blob à partir du stockage blob d'une taille de 1 Go.

Si j'utilise MS Azure Storage Explorer, cela prend moins de 10 minutes (j'ai une ligne descendante de 20 mégabits).

Cependant, lorsque j'utilise du code:

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

(J'ai également essayé d'utiliser un flux en mémoire) il faut plus d'une heure pour télécharger 250 Mo (à quel point je l'ai tué). J'ai fait ce test plusieurs fois et cela se produit régulièrement.

J'ai également surveillé le trafic réseau.

  • Via Storage Exlorer, le trafic réseau vers le bas est d'environ 20 Mégabits
  • Via le code, le trafic réseau vers le bas est d'environ 1 Mégabit

EDIT: J'utilise toujours une ancienne version d'Azure Storage Explorer (1.4.1). Mais je peux confirmer que les nouvelles versions donnent également les mêmes résultats.

14
Murdock

Vous devez spécifier la version de MS Azure Storage Explorer que vous utilisez.

Si vous utilisez des versions plus récentes de 1.9.0/1.8.1/1.8.0 etc. (veuillez trouver plus de détails dans ce lien ), alors Azure Storage Explorer est intégré à azcopy qui utilise des commandes simples conçues pour des performances optimales. Vous pouvez donc avoir de bonnes performances pour le téléchargement/téléchargement, etc.

Lorsque vous utilisez du code pour télécharger/télécharger des objets blob, vous pouvez utiliser cela Microsoft Azure Storage Data Movement Library . Cette bibliothèque est basée sur le framework de mouvement de données de base qui alimente AzCopy, qui vous fournit également un téléchargement, un téléchargement haute performance.

11
Ivan Yang

J'ai finalement essayé 2 solutions proposées par @Ivan et @mjwills:

Les deux solutions sont beaucoup plus rapides que le DownloadToFileAsync d'origine. DownloadToFileParallelAsync n'est disponible que dans les versions ultérieures de la bibliothèque et n'était donc pas disponible dans celle que j'avais installée.

6
Murdock

Je suggère d'utiliser DownloadToFileParallelAsync .

Selon les documents:

Lance une opération asynchrone pour télécharger le contenu d'un blob dans un fichier en effectuant des requêtes parallèles.

et:

Le parallelIOCount et le rangeSizeInBytes doivent être ajustés en fonction du processeur, de la mémoire et de la bande passante.

Cette API ne doit être utilisée que pour les téléchargements plus volumineux car une demande HEAD est effectuée avant le téléchargement des données.

Pour les blobs plus petits, veuillez utiliser DownloadToFileAsync ().

Pour obtenir les meilleures performances, il est recommandé d'essayer plusieurs valeurs et de mesurer le débit.

Un point de départ serait de définir le parallelIOCount sur le nombre de CPU.

Ajustez ensuite le rangeSizeInBytes de sorte que parallelIOCount fois rangeSizeInBytes égale la quantité de mémoire que vous souhaitez que le processus consomme.

L'avantage de cette méthode par rapport à DownloadToFileAsync est que plusieurs "tranches" du fichier sont téléchargées en parallèle (en même temps). Cela peut être bénéfique pour les fichiers volumineux sur des connexions Internet rapides (dans la plupart des cas, je m'attendrais à ce qu'il soit 4 à 8 fois plus rapide).

4
mjwills