Maison >développement back-end >Tutoriel Python >Comment la bibliothèque de requêtes de Python peut-elle être optimisée pour le streaming de téléchargements de fichiers volumineux ?

Comment la bibliothèque de requêtes de Python peut-elle être optimisée pour le streaming de téléchargements de fichiers volumineux ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-17 19:31:10836parcourir

How Can Python's Requests Library Be Optimized for Streaming Large File Downloads?

Téléchargement de fichiers optimisé pour le flux en Python avec Requests

Requests, une bibliothèque HTTP renommée, est confrontée à un défi dans la gestion des téléchargements de fichiers volumineux qui dépassent la mémoire disponible. Pour surmonter cette limitation, il est crucial de mettre en œuvre une approche de streaming qui lit et écrit des morceaux de fichiers au fur et à mesure de leur réception.

L'approche conventionnelle, comme le montre l'extrait de code fourni, est insuffisante à cet égard. Malgré l'utilisation de r.iter_content(), qui parcourt le contenu de la réponse par morceaux, la réponse est toujours mise en cache en mémoire.

Pour résoudre ce problème, envisagez d'introduire des fonctionnalités de streaming dans le code. La modification clé réside dans l'implémentation de request.get() avec le paramètre stream défini sur True. Cela permet à la bibliothèque de récupérer le contenu de la réponse sans le stocker en mémoire :

def download_file(url):
    local_filename = url.split('/')[-1]
    with requests.get(url, stream=True) as r:
        r.raise_for_status()
        with open(local_filename, 'wb') as f:
            for chunk in r.iter_content(chunk_size=8192): 
                f.write(chunk)
    return local_filename

Grâce à cette optimisation, la consommation mémoire de Python reste limitée quelle que soit la taille du fichier téléchargé. L'utilisation de iter_content avec une taille de bloc spécifiée garantit que les données sont écrites dans le fichier dans des portions gérables, évitant ainsi l'épuisement de la mémoire.

Notez que le nombre d'octets renvoyés dans chaque bloc peut ne pas correspondre précisément à la taille de bloc spécifiée. . Il est courant que la taille du fragment récupéré varie et soit nettement supérieure à la taille désignée. Pour plus de détails sur ce comportement, reportez-vous à la documentation officielle du workflow iter_content et body content.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn