2012-10-05 13 views
15

ウェブワーカーとメインスレッドの間に大量のデータ(複数のMB)を渡す方法はありますか?私はファイルをダウンロードして少し修正して、何らかの形で修正されたファイルをダウンロードさせる必要があるプロジェクトで働いています。私は定期的にpostMessageメソッドを使用して、WebワーカーとメインUIウェブワーカーとメインスレッドの間で大量のデータを渡す

  1. の間でデータを渡すために、次の方法を発見しました。私は、(1)時に罰金だと思う(だけでなく他の人には、Chromeで動作します?)ブロブへのURL参照を作成し、唯一のURLを送信

を譲渡するオブジェクト(Chromeのみ)

  • を使用して
  • より小さいオブジェクトを送信しますが、JSONとしてシリアル化されて送信されるため、数MBを超えるファイルを処理するには多くの時間とスペースが必要です。 Chromeは、データをコピーする必要がない転送可能オブジェクトを使用してデータを転送する方法を提供します。残念ながら、これはそれ以外の目的を果たして以来、これまでのChrome専用の機能です。

    私が最後に見つけたのは、作業員から、self.webkitURLを使用してblobへのURLを作成し、UIへのURL参照のみを渡すことでした。これはうまくいく、私はユーザーにURLを与えることができ、彼らはファイルをダウンロードすることができます。私は残念なことにこれを行う方法がFirefoxにあるとは見当たりませんでした。それは可能でしょうか?

    ワーカーとメインスレッドの間でデータを転送するために使用できる他の方法はありますか?

  • 答えて

    2

    これによると、WebWorkersはFileオブジェクトとBlobオブジェクト、さらにはstructured clone algorithで使用できるオブジェクトを基本的に渡すことができます。少なくともChromeはそれを実行します。私はそれが主な理由かどうかはわかりませんが、実際にはこの機能は他のブラウザに実装されています...ユーザーが選択したファイルをバックグラウンドで処理できることはいいことです。

    +0

    にデータを送信するのパフォーマンスが向上します。 – Erik

    10

    Firefox/Opera/Chromeは現在、すべて非常に高速なa flavor of web workers called Transferable Objectsをサポートしています。設定も非常に簡単です。ここでは、ww(Webワーカー)に、ブラウザで割り当てられた配列を送信します。この配列は、wwによって読み込まれ、ブラウザ側に返されます。これは、参照することによってではないコピーが渡されます。ブラウザを< - >ブラウザ側でWW

    var huge_array = new Float32Array(SIZE); 
    
    // worker.postMessage(huge_array.buffer);      // old way 
        worker.postMessage(huge_array.buffer, [huge_array.buffer]); // new Trans Obj 
    

    、その後オーバーウェブワーカーの内側:

    self.onmessage = function(e) { 
    
         var flt_arr = new Float32Array(e.data); 
    
        // typically you might want to populate flt_arr here 
    
        // now send data structure back to browser 
    
        // self.postMessage(flt_arr.buffer);     // old way 
         self.postMessage(flt_arr.buffer, [flt_arr.buffer]); // new Trans Obj way 
    } 
    

    単に置くことによって、角括弧内のデータオブジェクト 転送可能オブジェクトモードを使用するには、このヒントをオフにしてください。これは、型付き配列だけでなく、複数の変数を含むjavascriptオブジェクトを前後に送信する場合にも機能します。

    To quote

    譲渡オブジェクト(例えば構造クローニングのようなものを使用して)コピーされないオブジェクトです。代わりに、データはあるコンテキストから別のコンテキストに転送されます。呼び出しコンテキストからの 'バージョン'は、新しいコンテキストに転送されても使用できなくなります。たとえば、メインアプリケーションからWorkerにArrayBufferを転送すると、メインスレッドの元のArrayBufferがクリアされ、使用できなくなります。これは非常に残念ながら、それはそれは確かに速度を上げても、まだコピー操作ですワーカー

    http://html5-demos.appspot.com/static/workers/transferables/index.html https://html.spec.whatwg.org/multipage/workers.html

    +0

    お見積もりはどこで手に入りましたか? – royhowie

    +0

    引用文はEric Bidelman(Googleスタッフ)からのものです。「Yo dawg、これはなんですか?」をクリックすると表示されます。上記のURLの上部に表示されます。親リンクはhttp://updates.html5rocks.com/2011/12/Transferable-Objects-Lightning-Fastです –

    関連する問題