2011-04-12 10 views
0

私は、HTMLからテキストを抽出し、文や単語などの言語単位を抽出するブラウザベースの(Javascript and jQuery)言語分析ツールを作成しています。WebWorkersを使用して非常に長いページの単語頻度を計算できますか?

テキストをインポートするために、PHPバックエンドは特定のURLをスパイダーし、結果のHTMLをサニタイズします。ソースHTMLページが非常に長い場合、私はいくつかの困難に遭遇してきた

:そのHTMLは、インターフェイスにdiv#containerにこのようなものを挿入されています。そのようなページを読んでインターフェイスのDOMに挿入しても問題は発生しないようです(ただし、しばらく時間がかかります)。

しかし、ページが長くなると、spideredコンテンツ上で単語頻度アルゴリズムを実行するのが非常に遅くなります。ページが100Kワードに近づくと、物事はかなり停止することになります。

だから、私はいくつかのオプションを参照してください。それはソースドキュメントを切り捨てるか、複数のドキュメント

  • にそれを細分化するように

    1. 変更PHPのクモを変更する単語頻度アルゴリズム、それは正確なあまりだように、単語の分布を完全に記録するのではなく、サンプルを抽出します。
    2. この新しいファンワルドWebワーカーのことを試して、複数のバックグラウンドプロセスに計算を分散できるかどうかを試してみてください。

    (3)は、Webワーカーが行うように設計されたものです。私はspideredコンテンツをチャンクに分割し、各チャンクに1つのWebワーカーを割り当てることを想像しています。各チャンクの単語頻度プロファイルは、Webワーカーから返され、合計されてグラフに表示されます。

    私がこれを試みる前に、以前はWeb Workersで働いていたかもしれない他の人々から健全性チェックを受けることができたと思っていました。 1つ目は、div#containerの内容を効率的に分割することが問題になるのではないかと疑問に思っています.DOMツリーを通した何らかのトラバーサルがdiv#containerの下にあると思います。

  • 答えて

    0

    Webワーカーは確かに実行可能なオプションですが、ブラウザ間の互換性を保証できないというトレードオフがあります。コンテンツをチャンクに分割し、setTimeoutを使用して、それが違いを生むかどうかを確認する価値があります。ブラウザがロックされるのを防ぎ、長時間実行されるスクリプト警告の発生を防止します。ニコラス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ワーカーが行く方法です。

    +0

    ゲイリーありがとう、私はこのアプローチを試して、それがどうなるか見てみましょう。私はここに返信します... ここでは、「callee」の使用が不思議です。 –

    +0

    はい、そうです。 'setTimeout(function wrap(){;});'を外側の 'setTimeout'呼び出しで使用し、' 'arguments.callee'の代わりに' 'wrap'を呼び出すだけでいつでも名前付き関数を使用することができます。 –

    関連する問題