ビデオと字幕 · ダイレクト メディア ダウンローダー
サイズの大きなメディアのダウンロードがブラウザーのメモリにどのように収まるか: ストリーム、BLOB、および制限
· 仕組み
ダウンロード パフォーマンス ブラウザ
ToolAcre は、サイズ制限はアップロードの上限ではなく、デバイスのメモリであると述べています。この投稿では、直接ダウンロードの意味、つまり応答本文がどのように読み取られるか、バイトがどこに存在するか、ブラウザーのタブに空きがなくなったときについて説明します。
ファイルは数ギガバイトであり、ダウンロードは途中で停止します。メモリ制限がブラウザ側のダウンロードで引き起こす問題です。
ブラウザ側での保存には、受信したチャンクと完成した BLOB のためのスペースが必要になるため、長時間の記録は着実に進んで停止する可能性があります。停止のパーセンテージだけでは原因を診断できません。ネットワークが一時停止したり、ホストが接続を閉じたり、キャンセルが発生したり、プロセスがメモリ不足に近づいたりする可能性があります。
ToolAcre は 1 つの境界を決定的にします。 `downloadMedia` のデフォルトの最大値は 2 GiB であり、本文を読み取る前にそれより大きい宣言された Content-Length を拒否します。ホストがそのヘッダーを省略または過小評価した場合、チャンクの到着時に同じ制限が再度適用され、無制限のアキュムレーターが防止されます。 BLOB アセンブリ、ページ状態、および実装のオーバーヘッドにより、応答ペイロードのみが示すよりも多くのリソースが必要になる可能性があるため、境界近くで宣言された値は注意が必要です。
応答本文の読み取り方法: ReadableStream のチャンクと 1 つの大きなバッファー - 進行が徐々に進む間にブラウザーが何をしているか
Fetch は、ブラウザーが応答本文を提供する場合、応答本文を ReadableStream として公開します。実装はリーダーを取得し、チャンクを待機し、各 `Uint8Array` をカウントし、進行状況を更新し、最終的な BLOB 構築のためにチャンクを保存します。ストリーミングにより進行とキャンセルが本物になります。ストレージを一定にするわけではありません。
Content-Length が正の有限値の場合、インターフェイスは合計に対する受信バイト数を表示できます。これがないと、ディスプレイは受信したバイト数を報告しますが、パーセンテージを計算することを拒否します。読み取り可能な本文が存在しない場合、コードは `response.blob()` にフォールバックし、最終的なサイズのみを報告します。保持された各チャンクにより、後のアセンブリが可能になりますが、真のディスク ストリーミング設計には、ここには示されていない別のブラウザ API、アクセス許可モデル、障害戦略が必要になります。
完成した BLOB が存在する場所と、ブラウザーストレージの約束が安全ではない理由
収集された Blob は、MIME ラベルが付いた不変バイトを表すブラウザー オブジェクトです。仕様では、特定のブラウザがすべてのバッキング バイトを RAM に保持するか、一部のデータを流出するか、アセンブリ中にバッファを複製するかどうかは保証されていません。したがって、記事のガイダンスでは、普遍的な保管場所の主張を回避する必要があります。
アプリケーションが証明しているのは、ストリームが終了するまでチャンク参照を保持し、その後 1 つの Blob を構築し、それをデバイスに保存アクションで使用できるように維持するということです。このワーキング セットはページや他のタブと競合するため、デバイスとブラウザの条件は明示的な上限を下回る実際的な制約のままになります。この違いが、ドキュメントで特定の RAM 乗数、ディスク流出しきい値、ブラウザ依存の割り当て手法を約束するのではなく、リソースの圧迫と名付けている理由です。
アップロード制限はないのに、2 GiB ダウンロード ガードがある理由
ファイルが ToolAcre にアップロードされず、リレーがメディアを受信しません。 GET は訪問者のブラウザから提供されたホストに送信されます。これによりサーバーのアップロード クォータが削除されますが、これは「無制限」を意味するものではありません。ソースは最大 2 ギビバイトを強制し、代わりにネイティブの保存リンクを使用するように大規模なジョブに指示します。
ホストは、Content-Length を通じて過剰なサイズを通知し、早期の拒否を許可できます。長さを指定せずにストリーミングすることもできます。その場合、ToolAcre は実際のチャンクをカウントし、制限を超えた後に停止します。この障害の後、部分的なバイトは切り詰められたダウンロードとして提供されません。初期チェックとストリーミング チェックでは、正確な長さのヘッダーと存在しない長さのヘッダーがカバーされますが、不正確な小さなヘッダーは、測定されたボディが同じ天井を通過した場合にのみ検出されます。
実際の例: 限られた RAM を備えたラップトップでの長い講義の録音 — 予想されることと、ネットワーク ストールによるメモリ負荷の見分け方
ラップトップ上ですでにエディターと多くのタブが実行されている講義ファイルを想像してください。まずチェックリンクを押して、記載されているサイズとガードを比較してください。ダウンロード中、合計を伴わない定常的なバイト更新は、ホストが使用可能な長さを省略したことを意味します。凍結されたリクエスト行には、代わりにトランスポートの一時停止が表示される場合があります。
リクエストがアクティブなままでもメモリ負荷がタブに影響を与える可能性がありますが、ToolAcre はオペレーティング システムを検査して原因を宣言することはできません。ブラウザのタスク ツール、システム メモリ ビュー、リクエスト タイムラインは補足的な証拠を提供します。やみくもに再試行すると、同じ割り当て要求が繰り返される可能性があります。リクエストが HTTP ステータスで終了した場合は、まずその応答を調査してください。メモリ負荷は、中断された大規模な転送ごとにデフォルトで役立つ説明ではありません。
実践的な習慣: 他のタブを閉じ、一度に 1 つのファイルをダウンロードする — タブに必要なスペースを与える方法
制限に近い転送を開始する前に関連のない重いタブを閉じ、一度に 1 つの大きなジョブをアクティブにし、保存アクションが開始されるまで結果をクリアしないようにします。これらの習慣は競争を減らしますが、コード化された最大値を上げたり、制約のあるデバイスでの成功を保証したりするものではありません。
最初にチェックすることは、ホストが Content-Length を提供する場合に便利ですが、欠損値は「小さい」ではなく「不明」を意味します。 raw バイト カウンターを監視し、転送が予期されたアセットでない場合はキャンセルします。キャンセルでは、不完全なバイトを成功として提示するのではなく、部分的なファイルが破棄され、リーダーのロックが解放されます。すぐに保存すると、準備完了の BLOB がページ状態で到達可能な期間も短縮されますが、JavaScript ではブラウザーがバッキング ストレージを再利用する正確な瞬間を保証できません。
これでカバーされないもの — 壊れたダウンロードの再開、ファイルを部分に分割する、またはデバイスが保持できる容量を超えるダウンロード
このパスは、Range リクエストの発行、中断された転送の再開、出力の分割、ユーザーが選択したファイル ハンドルへの直接ストリーミング、またはキューのスケジュールを実行しません。 HEAD 応答はバイト範囲がサポートされているかどうかを報告しますが、ダウンローダーはその勧告結果を再開動作に変換しません。
ガードを超えたファイルは、ネイティブ ブラウザーのダウンロード、許可されたコマンド ライン クライアント、または BLOB 保存の結果全体を保持せずに段階的に書き込む別の許可されたワークフローに属します。この選択はメモリ アーキテクチャに関するものであり、ログイン、CORS、DRM、権利制限の回避策ではありません。再開可能なクライアントは、信頼性の低い接続に適している場合がありますが、これはファイル ソースと承認によってそのクライアントが同じリソースにアクセスすることが許可されている場合に限られます。
要点: 明示的なガードと利用可能なデバイス メモリの両方が重要です
正確な制限ステートメントには 2 つの層があります。ToolAcre はデフォルトで 2 GiB を超える転送を拒否しますが、より小さい転送はブラウザーの利用可能なリソースによって制限される可能性があります。 「アップロード上限なし」は、リレーが存在しないことを表します。これは、ダウンロード可能なサイズが無限であることを意味するものではありません。
適切なファイルの場合、チャンク リーダーは正確な進行状況を提供し、AbortController はキャンセルを提供し、Blob 作成は保存可能な結果を提供します。ダイレクト メディア ダウンローダーは、ブラウザーのタブが制限されたワークスペースであることを認識しながら、ホストからブラウザーへの直接ルート上のバイトを保持します。特に、利用可能なリソースが急速に変化する可能性がある管理対象のラップトップまたはモバイル デバイスでは、転送を開始する前に 2 つの制限を合わせて計画する必要があります。