ホームページ  >  記事  >  バックエンド開発  >  FastAPI の UploadFile 処理が Flask よりも遅いのはなぜですか?

FastAPI の UploadFile 処理が Flask よりも遅いのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-08 11:18:021025ブラウズ

Why is FastAPI's UploadFile Handling Slower Than Flask's?

Flask と比較した FastAPI UploadFile のパフォーマンスの問題

FastAPI の UploadFile 処理は、ファイル処理の違いにより、Flask よりも遅くなる可能性があります。 Flask は同期ファイル書き込みを使用しますが、FastAPI の UploadFile メソッドは非同期であり、デフォルト サイズ 1 MB のバッファを使用します。

パフォーマンス向上ソリューション

パフォーマンスを向上するには、次の実装を行います。 aiofile と非同期でファイルを書き込むlibrary:

<code class="python">from fastapi import File, UploadFile
import aiofiles

@app.post("/upload")
async def upload_async(file: UploadFile = File(...)):
    try:
        contents = await file.read()
        async with aiofiles.open(file.filename, 'wb') as f:
            await f.write(contents)
    except Exception:
        return {"message": "There was an error uploading the file"}
    finally:
        await file.close()

    return {"message": f"Successfully uploaded {file.filename}"}</code>

追加メモ

  • この方法では、ファイル全体がメモリ内に保持されるため、大きなファイルには理想的ではない可能性があります。
  • チャンクファイルのアップロードの場合は、より小さいバッファーで await file.read() メソッドを使用することを検討してください。 size.
  • または、shutil.copyfileobj() を run_in_threadpool() とともに使用して、別のスレッドでブロック操作を実行し、メイン スレッドの応答性を確保することもできます。

ストリーミング ソリューション

パフォーマンスをさらに向上させるには、リクエスト本文にストリームとしてアクセスすることを検討してください。本体全体をメモリまたは一時ディレクトリに保存せずに:

<code class="python">from fastapi import Request
import aiofiles

@app.post("/upload")
async def upload_stream(request: Request):
    try:
        filename = request.headers['filename']
        async with aiofiles.open(filename, 'wb') as f:
            async for chunk in request.stream():
                await f.write(chunk)
    except Exception:
        return {"message": "There was an error uploading the file"}

    return {"message": f"Successfully uploaded {filename}"}</code>

以上がFastAPI の UploadFile 処理が Flask よりも遅いのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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