ホームページ >バックエンド開発 >Python チュートリアル >タイムアウトやその他の応答エラーを回避するためにストリーム ダウンロードを使用して大きなファイルのダウンロードを処理する
Web アプリケーションで大きなファイルのダウンロードを扱う場合、開発者が直面する一般的な問題の 1 つは、タイムアウト、応答時間、メモリ過負荷エラーです。ほとんどの Web サーバーとクライアントには応答を待つ時間に制限があり、ダウンロード プロセスに時間がかかりすぎると、これらのエラーが発生する可能性があります。これを軽減するには、ストリーミング ダウンロードがより効率的でスケーラブルなソリューションです。
この記事では、Python のストリーミング機能を使用して大きなファイルのダウンロードを処理することで、タイムアウトや応答エラーを回避する方法を検討します。具体的には、チャンク ダウンロード、その仕組み、および大きなファイルを処理する際のパフォーマンスを最適化する方法について説明します。
ユーザーが大きなファイルをリクエストした場合、Web サーバーは次のことを行う必要があります。
このプロセスは簡単そうに見えますが、ファイル サイズが大きくなると問題が発生します。発生する可能性のある問題は次のとおりです:
解決策: ファイルをチャンクに分けてストリーミングし、サーバーがファイルをより小さく管理しやすい単位で処理できるようにし、これらの問題が発生する可能性を減らします。
ストリーミングでは、ファイル全体をメモリに読み取って 1 つの大きな応答で送信するのではなく、ファイルを小さなチャンクに分割し、順次読み取って送信します。これにより、クライアントは、ファイル全体がロードされるのを待ってから送信を開始するのではなく、より早くファイルの一部の受信を開始できるようになります。
ストリーミングが有益な理由は次のとおりです:
Google ドライブ、または SharePoint、GoogleCloudStorage などの他のストレージからファイルをダウンロードするとします。チャンクベースのファイルのダウンロードには ジェネレーター を使用できます。その様子は次のとおりです。
GoogleDrive: def generate_chunks(request, chunksize = 10 * 1024 * 1024): #10MB file_buffer = io.BytesIO() downloader = MediaIoBaseDownload(file_buffer, request, chunksize=chunksize) done = False previous_bytes = 0 while not done: status, done = downloader.next_chunk() if status: new_bytes = downloader._progress - previous_bytes file_buffer.seek(previous_bytes) chunk_data = file_buffer.read(new_bytes) previous_bytes = downloader._progress yield chunk_data def file_loader(user_name, file_properties, credentials): file_uri = file_properties["file_uri"] # Your logic from Google Drive Doc to authenticate the user # and getting the file in request request = service.files().get_media(fileId=file_uri) return lambda: GoogleDrive.generate_chunks(request)
ストリームのダウンロードの場合、次のように応答を処理する必要があります
file = GoogleDrive.file_loader(user_name, file_properties, credentials) response = Response(file(), content_type='application/octet-stream') filename = "some example file.mp4" response.headers['Content-Disposition'] = f"attachment; filename*=UTF-8''{quote(filename)}" return response
DB からの動的ファイル名を使用する場合、ファイル名を UTF-8 エンコードの正しい形式で含めると、ファイル名に絵文字や特殊文字が含まれている場合の問題を回避できます。
以上がタイムアウトやその他の応答エラーを回避するためにストリーム ダウンロードを使用して大きなファイルのダウンロードを処理するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。