ホームページ >バックエンド開発 >Python チュートリアル >FastAPI で JSON データの取得速度を最適化するには?

FastAPI で JSON データの取得速度を最適化するには?

DDD
DDDオリジナル
2024-10-18 22:58:30623ブラウズ

How to Optimize JSON Data Retrieval Speed in FastAPI?

FastAPI での JSON データ取得速度の最適化

FastAPI の GET エンドポイントからの大量の JSON ペイロードの戻りが遅いという問題が繰り返し発生します。 json.dumps() を使用して json.loads() を使用してファイルからデータを送信すると、応答が大幅に遅延します。戻りデータを使用してユーザーにデータを送信できますが、より効率的なアプローチはありますか?

問題:
処理パイプラインは、最初に pandas の to_json を使用してデータを JSON に変換します。 () 関数を使用して、それを json.loads() で辞書にロードし、最後に JSON に変換し直します。この複数ステップの変換プロセスにより、かなりの遅延が発生します。

提案された解決策:

まず、FastAPI が戻り値を JSON 互換データに変換することを認識することが重要です。 jsonable_encoder に続いて、標準の Python の json.dumps() 関数を使用してシリアル化します。この 2 段階のプロセスは遅いことが知られています。

オプション 1: 代替 JSON エンコーダを使用する
orjson や ujson などの代替 JSON エンコーダの使用を検討してください。これらのエンコーダーは、デフォルトの jsonable_encoder と json.dumps() の組み合わせよりも優れたパフォーマンスを発揮します。

オプション 2: カスタム レスポンスを直接返す
最適なパフォーマンスを得るには、カスタム APIRoute クラスを使用してレスポンスを返します。物体。これにより、FastAPI のデフォルトの JSON 変換プロセスがバイパスされます。

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

追加の考慮事項:

  • ストリーミング レスポンス: を処理する場合は、ストリーム レスポンスの使用を検討してください。非常に大きなデータセットは、メモリ不足の問題を引き起こす可能性があります。
  • Dask ライブラリ: Dask を利用して、大量のデータを効率的に処理します。 .to_json() を使用する前に、結果の Dask DataFrame を Pandas DataFrame に変換します。
  • File Download: 応答をバイパスしてファイルとしてダウンロードする必要があることを示す Content-Disposition ヘッダーを設定します。ブラウザのレンダリングの遅延。

以上がFastAPI で JSON データの取得速度を最適化するには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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