2017-06-13 8 views
0

AudioBufferに2つの300MB MP3ファイルをロードしてから、WAVファイルとしてエンコードします。エンコーディングのプロセスのどこかで(Webワーカーで起こる)、メモリ不足のためブラウザがクラッシュします。Chromeのメモリクラッシュを捕まえて処理する方法

Chrome crash

WAVファイルは、MP3ファイルよりも約3倍大きいので、変換を行うために〜1.8ギガバイト追加のスペースが必要になります。

ファイルは、ユーザーがアップロードを選択したmp3ファイルであるため、10MBまたは350MBにすることができます。これは、メモリが十分であるか不十分である可能性があることを意味します。十分でない場合は、単にブラウザをクラッシュさせる代わりに、単にエラーを捕まえて処理するだけですか?

私はユーザーを特定のプロジェクト(すべてのファイルを結合したもの)のサイズに制限しますが、OS、OSアーキテクチャ、ブラウザのバージョン、ブラウザのアーキテクチャによって最大メモリの制限が異なるようです。

答えて

1

残念ながら、メモリ不足のエラーを「キャッチして処理する」方法はありません。申し訳ありません。設計上、セキュリティ上の理由から、V8は必要なメモリを割り当てることができない場合、常にプロセスをクラッシュさせます。

JavaScriptヒープのメモリ制限は、マシンが持つ物理メモリの量に基づいて動的に決定されます。数十年の間、「十分な」RAMが与えられた場合、32ビットデスクトップアーキテクチャでは700 MB、64ビットアーキテクチャでは1400 MBでした。最近のバージョンのChrome/V8では戦略が調整されており、上限は64ビットで2048MBになりました。だから、具体的な内容は時間とともに変化する可能性があります。しかし、OSは重要ではありません(少なくとも、JavaScriptヒープではありません)。

AudioBuffersがV8のヒープリミットに含まれるかどうかは完全にはわかりません(V8自体はAudioBuffersについてはわかりませんが、埋め込みによって実装されています。つまりBlink)。

最後のすべてのバイトをその最大値まで使用することはできないことに注意してください。一部のメモリは内部メタデータに使用されます。配列などを動的に成長させると、それらは塊で成長するため、成長前のサイズが「最大マイナス1」ではないにもかかわらず、成長しようとする試みが限界に達する可能性が高くなります。 32ビットプラットフォームでは、単一のラージオブジェクトを割り当てようとすると、アドレス空間の枯渇のために失敗する可能性があります。ランダムに選択された多数のページがこのために割り当てられ、プロセスの存続期間にわたって割り当てられた後は、ヒープリミットにまだ達していなくても、数百メガバイトの大きなオブジェクトを割り当てるために利用できる大きな連続したアドレス空間のブロック。

サイドノート:「three times larger」?一般的に使用されるMP3ビットレートでは、WAVファイルが最大10倍大きくなると思います。

+0

この回答(https://stackoverflow.com/a/34667584/5086286)では、OSとブラウザのバージョンがメモリ制限に影響を与えることを示していますが、話している間にタブメモリ全体を話している可能性があります具体的にはJSヒープサイズに関するものです。 「AudioBuffers」はV8のヒープに含まれていると思います。「ヒープスナップショット」を取ると、それが含まれています。 WAVエンコーディングについては、16ビットファイルに変換しています。これは、なぜ3〜4倍のサイズにすぎないのかを説明します。私はJSのヒープの限界をテストし、私はあなたに戻ってきます。あなたの助けをありがとう! – maximedupre

+0

私は現在、JSヒープサイズが1503MB(ヒープスナップショットによる)の作業ページを持っています。これは1400MBが限界ではないと信じさせています。 – maximedupre

+0

ハァッ、良い点。 Chrome M56とM57がそれを2048 MBにぶつけるまで、限界は1400 MBだったことが分かります。私は私の答えを更新します。 – jmrk

関連する問題