Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在web worker和主线程之间传递大量数据_Javascript_Html_Web Worker_Html5 Filesystem - Fatal编程技术网

Javascript 在web worker和主线程之间传递大量数据

Javascript 在web worker和主线程之间传递大量数据,javascript,html,web-worker,html5-filesystem,Javascript,Html,Web Worker,Html5 Filesystem,有没有办法在web工作线程和主线程之间传递大量数据(多MB)?我在一个项目中工作,我需要下载文件,对它们进行一些修改,然后让用户下载修改后的文件。我发现了以下在web worker和主UI之间传递数据的方法 使用常规的postMessage方法 使用可转移对象(仅限Chrome) 创建一个指向blob的URL引用,只发送URL(在Chrome中也可以,在其他浏览器中也可以?) 我认为(1)在发送较小的对象时很好,但在处理大于几MB的文件时需要花费大量的时间和空间,因为它是序列化的,并作为JSON

有没有办法在web工作线程和主线程之间传递大量数据(多MB)?我在一个项目中工作,我需要下载文件,对它们进行一些修改,然后让用户下载修改后的文件。我发现了以下在web worker和主UI之间传递数据的方法

  • 使用常规的
    postMessage
    方法
  • 使用可转移对象(仅限Chrome)
  • 创建一个指向blob的URL引用,只发送URL(在Chrome中也可以,在其他浏览器中也可以?)
  • 我认为(1)在发送较小的对象时很好,但在处理大于几MB的文件时需要花费大量的时间和空间,因为它是序列化的,并作为JSON发送。Chrome提供了一种使用可转移对象传输数据的方法,而不必复制数据。不幸的是,到目前为止,这是Chrome唯一的功能,否则它会达到我的目的

    我发现的最后一件事是,从worker开始,使用
    self.webkitURL
    创建指向blob的URL,然后只将URL引用传递给UI。这工作得很好,我可以给用户的URL,他们可以下载文件。不幸的是,我还没有在Firefox中找到这样做的方法,有可能吗


    有没有其他方法可以用来在worker和主线程之间传输数据?

    根据这一点,webworker现在支持传递文件和Blob对象,基本上还支持任何可以与。。。或者至少Chrome做到了这一点,可能是因为它实现了文件系统API。我不知道这是否是主要原因,但我希望不是,事实上,这个功能在其他浏览器中实现。。。能够在后台处理用户选择的文件是一件好事。

    Firefox/Opera/Chrome目前都支持,速度非常快,安装也非常简单。在这里,我们向ww(web worker)发送一个浏览器分配的数组,该数组由ww填充并返回到浏览器端。这是通过引用传递的,而不是副本:browser ww

    在浏览器端:

    var huge_array = new Float32Array(BIG_HUSKY_SIZE);
    
    // worker.postMessage(huge_array.buffer);                      // old way
       worker.postMessage(huge_array.buffer, [huge_array.buffer]); // new Trans Obj
    
    然后在web worker内部:

    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
    }
    
    只需将数据对象放在方括号内[此处] 这提示js使用可转移对象模式。当来回发送包含多个变量(而不仅仅是类型化数组)的javascript对象时,这种方法也有效

    :

    可转移对象是指未复制的对象(例如,使用结构化克隆之类的方法)。相反,数据从一个上下文传输到另一个上下文。调用上下文中的“版本”在传输到新上下文后不再可用。例如,将ArrayBuffer从主应用程序传输到Worker时,主线程中的原始ArrayBuffer将被清除,不再可用。这大大提高了向工作者发送数据的性能


    不幸的是,这仍然是一个复制操作,即使它确实提高了速度。你从哪里得到的报价?报价来自Eric Bidelman(谷歌职员),如果你点击上面URL列表顶部的“Yo dawg,这是什么?”就会出现。。。它的父链接是