0

HTML からテキストを抽出し、文や単語などの言語単位を抽出するブラウザー ベース (Javascript および jQuery) の言語分析ツールを作成しています。

テキストをインポートするために、PHP バックエンドは特定の URL をスパイダーし、結果の HTML をサニタイズします。次に、その HTML がインターフェイスの a に挿入されdiv#containerます。次のようになります。

ソース HTML ページが非常に長い場合、いくつかの問題に遭遇しました。このようなページを読み込んでインターフェイスに挿入しても、DOM問題は発生しないようです (時間がかかりますが)。

しかし、スパイダーされたコンテンツに対して単語頻度アルゴリズムを実行すると、ページが長い場合、非常に遅くなります。たとえば、ページが 100K ワードに近づくと、物事はほとんど停止します。

したがって、いくつかのオプションがあります。

  1. ソース ドキュメントを切り捨てるか、複数のドキュメントに分割するように PHP スパイダーを変更します。
  2. 単語頻度アルゴリズムを変更して正確性を低くし、単語分布を完全に記録するのではなくサンプリングします
  3. この新しい Web Worker を試して、計算を複数のバックグラウンド プロセスに分散できるかどうかを確認してください。

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

これを試す前に、以前に Web Workers で働いたことがあるかもしれない他の人々から健全性チェックを受けられることを願っていました。div#container1 つには、 のコンテンツを効率的に分割することが問題になるかどうか疑問に思っていdiv#containerます。.

4

1 に答える 1

0

Web ワーカーは確かに実行可能なオプションですが、トレードオフは、ブラウザー間の互換性を保証できないことです。コンテンツをチャンクに分割し、setTimeout を利用して、違いが生じるかどうかを確認する価値があるかもしれません。これにより、ブラウザーがロックされるのを防ぎ、実行時間の長いスクリプトの警告が発生するのを防ぐことができます。Nicholas Zakas は、この種のことについて少し前にブログ エントリを書きました

彼が提案する方法は次のとおりです。

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 に答える