问题描述
|
我正在编写一个基于浏览器的(JavaScript和jQuery)语言分析工具,该工具将从HTML提取文本,然后提取诸如句子,单词等的语言单元。
要导入文本,PHP后端会搜寻给定的URL并清理生成的HTML。然后将该HTML插入界面中的ѭ0中,如下所示:
当源HTML页面很长时,我遇到了一些困难。在界面的ѭ1中读取和插入此类页面似乎不会引起问题(尽管要花一些时间)。
但是,如果页面很长,对爬虫内容执行词频算法会非常慢。例如,如果页面接近10万个单词,它将几乎使一切陷入停顿。
因此,我看到一些选择:
更改PHP Spider,使其将截断源文档或将其细分为多个文档
更改词频算法,使其不太精确,并采样词分布而不是完全记录下来
尝试一下这种新型的Web Worker东西,看看我是否可以在多个后台进程之间分配计算。
在我看来,(3)只是Web Workers设计要做的事情。我正在想象将蜘蛛内容拆分为多个块,然后为每个块分配一个Web Worker。可以从Web Worker返回每个块的词频分布,然后将其汇总并呈现到图表中。
在尝试此操作之前,我希望可以从这里的其他人那里获得过健全性检查,这些人以前可能曾与Web Workers一起工作过。一方面,我想知道是否有效地拆分ѭ0的内容是否会成为一个问题-我想这将涉及在
div#container
下通过DOM树进行某种遍历。
解决方法
Web worker当然是一个可行的选择,但是要权衡的是您不能保证跨浏览器的兼容性。可能值得将内容分成多个部分并利用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的延迟。我在其他地方看到过它表示可以将延迟设置为0ms,因为这足以中断长时间运行的脚本并阻止浏览器锁定。
如果这不能改善问题,那么可以,Web Workers将是您的最佳选择。