Maison  >  Article  >  développement back-end  >  Comment optimiser la vitesse de récupération des données JSON dans FastAPI ?

Comment optimiser la vitesse de récupération des données JSON dans FastAPI ?

DDD
DDDoriginal
2024-10-18 22:58:30459parcourir

How to Optimize JSON Data Retrieval Speed in FastAPI?

Optimisation de la vitesse de récupération des données JSON dans FastAPI

Le retour lent d'une charge utile JSON importante à partir du point de terminaison GET de FastAPI est un problème récurrent. Lorsque vous utilisez json.dumps() pour transmettre des données à partir d'un fichier à l'aide de json.loads(), la réponse est considérablement retardée. Bien que les données de retour puissent être utilisées pour envoyer des données à l'utilisateur, existe-t-il une approche plus efficace ?

Problème :
Le pipeline de traitement transforme initialement les données en JSON à l'aide de to_json de pandas. (), puis le charge dans un dictionnaire avec json.loads() et le traduit enfin en JSON. Ce processus de conversion en plusieurs étapes introduit une latence importante.

Solution proposée :

Tout d'abord, il est crucial de reconnaître que FastAPI convertit les valeurs de retour en données compatibles JSON à l'aide de l'option jsonable_encoder, suivi d'une sérialisation à l'aide de la fonction json.dumps() standard de Python. Ce processus en deux étapes est connu pour être lent.

Option 1 : Utiliser des encodeurs JSON alternatifs
Envisagez d'utiliser des encodeurs JSON alternatifs comme orjson ou ujson. Ces encodeurs surpassent la combinaison par défaut jsonable_encoder et json.dumps().

Option 2 : Retour direct d'une réponse personnalisée
Pour des performances optimales, utilisez la classe APIRoute personnalisée et renvoyez une réponse objet. Cela contourne le processus de conversion JSON par défaut de FastAPI.

<code class="python">from fastapi.routing import APIRouter, APIRoute

class TimedRoute(APIRoute):
    ...

app = FastAPI()
router = APIRouter(route_class=TimedRoute)

@router.get("/custom-response")
def get_data():
    df = pd.read_parquet('data.parquet')
    return Response(df.to_json(orient="records"), media_type="application/json")

app.include_router(router)</code>

Considérations supplémentaires :

  • Réponses en streaming : Envisagez d'utiliser des réponses de flux si vous gérez des ensembles de données exceptionnellement volumineux peuvent entraîner des problèmes de mémoire insuffisante.
  • Bibliothèque Dask : Utilisez Dask pour traiter efficacement de grandes quantités de données. Convertissez le Dask DataFrame résultant en un Pandas DataFrame avant d'utiliser .to_json().
  • Téléchargement de fichier : Définissez l'en-tête Content-Disposition pour indiquer que la réponse doit être téléchargée sous forme de fichier, en contournant retards de rendu du navigateur.

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