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

Susan Sarandon
Libérer: 2024-10-18 23:02:30
original
675 Les gens l'ont consulté

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>
Copier après la connexion

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!

source:php
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!