Maison  >  Article  >  développement back-end  >  Comment optimiser les temps de réponse JSON pour les grands ensembles de données dans FastAPI ?

Comment optimiser les temps de réponse JSON pour les grands ensembles de données dans FastAPI ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-18 23:02:30676parcourir

How to Optimize JSON Response Times for Large Datasets in FastAPI?

Optimisation des temps de réponse JSON pour les grands ensembles de données dans FastAPI

Problème :

Récupération d'une quantité importante de données JSON à partir d'un Le point de terminaison FastAPI est sensiblement lent, nécessitant environ une minute. Les données sont initialement chargées à partir d'un fichier parquet à l'aide de json.loads() et filtrées avant d'être renvoyées. Recherche d'une approche plus rapide pour fournir les données.

Résolution :

Le temps de réponse lent provient de plusieurs conversions JSON dans la fonction parse_parquet(). FastAPI encode automatiquement la valeur renvoyée à l'aide de jsonable_encoder avant de la sérialiser avec json.dumps(), un processus qui prend du temps. Les encodeurs JSON externes comme orjson ou ujson offrent des améliorations potentielles de vitesse.

Cependant, la solution la plus efficace consiste à éviter les conversions JSON inutiles. Le code suivant utilise une classe APIRoute personnalisée pour activer les réponses JSON directes des pandas DataFrames :

<code class="python">from fastapi import APIRoute

class TimedRoute(APIRoute):
    # Custom handler for capturing response time
    def get_route_handler(self):
        original_route_handler = super().get_route_handler()
        
        async def custom_route_handler(request):
            before = time.time()
            response = await original_route_handler(request)
            duration = time.time() - before
            response.headers["Response-Time"] = str(duration)
            print(f"route duration: {duration}")
            return response

        return custom_route_handler</code>

Ce code vous permet de comparer les temps de réponse de différentes méthodes de conversion de données. En utilisant un exemple de fichier parquet avec 160 000 lignes et 45 colonnes, les résultats suivants ont été obtenus :

  • Encodeur FastAPI par défaut (json.dumps()) : Le plus lent
  • orjson : Comparable à l'encodeur par défaut
  • ujson : Légèrement plus rapide qu'orjson
  • PandasJSON (df.to_json()) : Beaucoup plus rapide

Pour améliorer l'expérience utilisateur, envisagez de définir l'en-tête Content-Disposition avec le paramètre de pièce jointe et un nom de fichier pour lancer un téléchargement plutôt que d'afficher les données dans le navigateur. Cette approche contourne les contraintes du navigateur et accélère le processus.

De plus, Dask permet une gestion optimisée des grands ensembles de données, offrant des alternatives aux pandas. Des réponses en streaming ou asynchrones peuvent également être envisagées pour éviter les problèmes de mémoire lors de la gestion de volumes de données massifs.

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