ホームページ  >  記事  >  バックエンド開発  >  FastAPI で大規模なデータセットの JSON 応答時間を最適化する方法

FastAPI で大規模なデータセットの JSON 応答時間を最適化する方法

Susan Sarandon
Susan Sarandonオリジナル
2024-10-18 23:02:30819ブラウズ

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

FastAPI での大規模なデータセットの JSON 応答時間の最適化

問題:

大量の JSON データをFastAPI エンドポイントは著しく遅く、約 1 分かかります。データは、最初に json.loads() を使用して寄せ木細工のファイルからロードされ、返される前にフィルタリングされます。データを配信するためのより迅速なアプローチを求めています。

解決策:

応答時間の遅さは、parse_parquet() 関数内の複数の JSON 変換に起因します。 FastAPI は、戻り値を json.dumps() でシリアル化する前に、jsonable_encoder を使用して自動的にエンコードしますが、これは時間のかかるプロセスです。 orjson や ujson などの外部 JSON エンコーダを使用すると、速度が向上する可能性があります。

ただし、最も効率的な解決策は、不必要な JSON 変換を避けることです。次のコードは、カスタム APIRoute クラスを利用して、pandas DataFrame からの直接 JSON 応答を有効にします。

<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>

このコードにより、さまざまなデータ変換メソッドの応答時間を比較できます。 160,000 行、45 列のサンプル寄木細工ファイルを使用すると、次の結果が得られました:

  • デフォルト FastAPI エンコーダー (json.dumps()): 最も遅い
  • orjson: デフォルトのエンコーダと同等
  • ujson: orjson よりわずかに高速
  • PandasJSON (df.to_json()): 最も大幅に高速化

ユーザー エクスペリエンスを向上させるには、ブラウザー内にデータを表示するのではなく、ダウンロードを開始するために、Content-Disposition ヘッダーにattachment パラメーターとファイル名を設定することを検討してください。このアプローチはブラウザーの制約を回避し、プロセスを高速化します。

さらに、Dask は大規模なデータセットの最適化された処理を提供し、パンダの代替手段を提供します。大量のデータを処理するときにメモリの問題を回避するために、ストリーミングまたは非同期応答も考慮される場合があります。

以上がFastAPI で大規模なデータセットの JSON 応答時間を最適化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。