0

我正在编写一个基于浏览器(Javascript 和 jQuery)的语言分析工具,它从 HTML 中提取文本,然后提取句子、单词等语言单位。

为了导入文本,PHP 后端会抓取给定的 URL 并清理生成的 HTML。然后将该 HTML 插入到div#container界面中的 a 中,如下所示:

当源 HTML 页面很长时,我遇到了一些困难。将这样的页面读取并插入到界面DOM中似乎不会引起问题(尽管需要一段时间)。

但是如果页面很长,对蜘蛛内容运行词频算法会非常慢。例如,如果页面接近 100K 字,它几乎会让事情陷入停顿。

所以,我看到了一些选择:

  1. 更改 PHP 蜘蛛,使其截断源文档或将其细分为多个文档
  2. 更改词频算法,使其不那么精确,并对词分布进行采样而不是完整记录
  3. 试试这个新奇的 Web Worker,看看我是否可以跨多个后台进程分配计算。

在我看来,(3) 只是 Web Workers 旨在做的事情。我想象将蜘蛛内容分成块,然后为每个块分配一个 Web Worker。可以从 Web Worker 中返回每个 chunk 的词频概况,然后汇总并渲染到图表中。

在我尝试这个之前,我希望我能从这里其他可能曾经使用过 Web Workers 的人那里得到一个健全的检查。div#container一方面,我想知道是否有效地拆分div#container.

4

1 回答 1

0

网络工作者当然是一个可行的选择,但代价是你不能保证跨浏览器的兼容性。可能值得将内容分成块并使用 setTimeout,看看这是否会有所不同。它将防止浏览器锁定,并防止出现任何长时间运行的脚本警告。Nicholas Zakas 不久前写了一篇关于这类事情的博客文章:http ://www.nczonline.net/blog/2009/01/13/speed-up-your-javascript-part-1/

他建议的方法是:

function chunk(array, process, context){
  var items = array.concat();   //clone the array
  setTimeout(function(){
    var item = items.shift();
    process.call(context, item);

    if (items.length > 0){
        setTimeout(arguments.callee, 100);
    }
  }, 100);
}

个人觉得100ms的延迟没必要;我在其他地方看到它说您可以延迟 0 毫秒,因为这足以中断长时间运行的脚本,并防止浏览器锁定。

如果这不能改善事情,那么是的,Web Workers 将是要走的路。

于 2011-04-12T21:20:28.460 回答