Maison  >  Article  >  développement back-end  >  Pourquoi la gestion des fichiers UploadFile de FastAPI est-elle plus lente que celle de Flask ?

Pourquoi la gestion des fichiers UploadFile de FastAPI est-elle plus lente que celle de Flask ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-08 11:18:02952parcourir

Why is FastAPI's UploadFile Handling Slower Than Flask's?

Problèmes de performances de FastAPI UploadFile par rapport à Flask

La gestion de UploadFile de FastAPI peut être plus lente que celle de Flask en raison des différences dans la gestion des fichiers. Flask utilise l'écriture de fichiers synchrone, tandis que les méthodes UploadFile de FastAPI sont asynchrones et utilisent un tampon avec une taille par défaut de 1 Mo.

Solution de performances améliorées

Pour améliorer les performances, implémentez écriture de fichiers de manière asynchrone avec la bibliothèque aiofiles :

<code class="python">from fastapi import File, UploadFile
import aiofiles

@app.post("/upload")
async def upload_async(file: UploadFile = File(...)):
    try:
        contents = await file.read()
        async with aiofiles.open(file.filename, 'wb') as f:
            await f.write(contents)
    except Exception:
        return {"message": "There was an error uploading the file"}
    finally:
        await file.close()

    return {"message": f"Successfully uploaded {file.filename}"}</code>

Notes supplémentaires

  • Cette approche conserve l'intégralité du fichier en mémoire, ce qui n'est peut-être pas idéal pour les gros fichiers.
  • Pour le téléchargement de fichiers fragmentés, envisagez d'utiliser la méthode wait file.read() avec une taille de tampon plus petite.
  • Vous pouvez également utiliser shutdown.copyfileobj() avec run_in_threadpool() pour effectuez des opérations de blocage dans un thread séparé, en garantissant que le thread principal reste réactif.

Solution de streaming

Pour des performances encore meilleures, envisagez d'accéder au corps de la requête comme un flux sans stocker l'intégralité du corps en mémoire ni dans un répertoire temporaire :

<code class="python">from fastapi import Request
import aiofiles

@app.post("/upload")
async def upload_stream(request: Request):
    try:
        filename = request.headers['filename']
        async with aiofiles.open(filename, 'wb') as f:
            async for chunk in request.stream():
                await f.write(chunk)
    except Exception:
        return {"message": "There was an error uploading the file"}

    return {"message": f"Successfully uploaded {filename}"}</code>

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