2016-08-10 2 views
1

私はhtml5キャンバスから.toDataURL()を使用してピクセルデータを取得する画像処理を行っています。Webワーカー - オブジェクトが値渡しで渡される場合は、メモリ使用量が倍増します

出力された配列が100MBのメモリを占有している場合、そのオブジェクトをワーカーに渡して何らかの計算を行います。オブジェクトが値渡しで渡されるため、この配列のコピーが2つあります。メモリの?

+2

これはおそらく実装に依存しますが、ワーカーは新しいスレッドを使用するため、別のスレッドと同じオブジェクトをメモリ内で使用できないと言うのは安全だと思うので、おそらく2つのオブジェクトがあります。 – adeneo

+1

しかし、最初の配列はすぐにGCされます。 –

+0

質問は、面白いことに答えるように、別のスレッドのために労働者は価値のあるものを渡します。私はかなりの量のRAMを使用しているモバイルデバイス上でいくつかのイメージ処理を行っています。デスクトップブラウザの場合、これは通常Webワーカーに配置します。画像データは、メインUIスレッドわずかな時間でもこのオーバーヘッドを2倍にすると、より小さいデバイスでプロセスが終了します。私の考えを確認するための歓声。 –

答えて

1

メモリの使用量が倍にならないようにするには、 Transferable ObjectベースのAPIを使用してください。 MDN docsにはゼロコピー操作があるため、メモリ使用量が2倍にならないことが期待できます。クロームの開発者から

var theOutputtedArray = ...; 
worker.postMessage(theOutputtedArray, theOutputtedArray); 

This older blog post(5年前)方法について説明します:あなたはすでに配列を扱っているように聞こえるので

が、これはおそらく、些細な二回postMessageに配列を渡すの変化であり、通常のメッセージの受け渡しとは異なり、いくつかのデモコードを提供します。

This slightly newer blog post RedHatの開発者は、メインスレッドとワーカースレッドの間で大きなオブジェクトを渡す3つの異なる方法のパフォーマンスを非常に詳細に比較します。

ハッピー読書。

+0

ポストピーターのための歓声、この夕方の記事を読んで楽しい時間があります! –

関連する問題