2010-12-05 4 views
1

大量のRSSフィードを解析し、それぞれからタイトルと説明要素のテキストを抽出する時間的なバッチジョブがある状況がありますフィードあたりのアイテム数を文字列に変換します。JavaとLuceneのRSSフィードから多数の文字列を処理するベストプラクティス

ただし、1文字あたりのフィードまたはアイテムの数はわからないため、各文字列は数千語からなる可能性があります。

私が見てるの基本的な擬似コードは、このようなものであると仮定します

for each feed 
    for each item within date/time window 
     get text from title element, concatenate it to title_string 
     get text from description element, 
      concatenate it to description_string 
      calculate top x keywords from title_string 

for each keyword y in x 
    calculate frequency of keyword y in description_string 

誰でもメモリ使用量を減らすために、このデータを処理する方法を提案することができますか?これは、各フィードからデータが読み込まれるため、StringBuildersを使用することとは別です。

フィードの内容はデータベースに保存されますが、各フィードに独自のデータベーステーブルがある場合に必要なすべてのIOを避けるために、「オンザフライ」で単語の頻度を計算します。

答えて

1

まず、Luceneを既にお持ちの場合は、データベースにテキストを保存する理由を理解できません。 Luceneはデータベースのの種類であり、インデックスには索引が組み込まれていますが、レコードIDではなく、これはテキスト文書の唯一の違いです。たとえば、フィード内の各アイテムをフィールド "title"、 "description"などの別々のドキュメントとして保存することができます。フィード自体に関する情報を格納する必要がある場合は、フィード用にもう1つのタイプのドキュメントを作成し、このIDはすべてのフィードのアイテムへの参照として使用されます。

これを行うと、単語の頻度を一定の時間内にカウントできます(実際の一定時間ではなくほぼ一定です)。ええ、それはIOを引き起こしますが、データベースを使ってテキストを保存することもできます。また、単語頻度情報を読むことは非常に高速である.Luceneは、逆インデックスと呼ばれるデータ構造、すなわちword -> vector of <doc_number/frequency> pairsのストアマップを使用する。検索時に、Luceneはドキュメント自体を読み込むのではなく、インデックスを読み込み、そのようなマップを取得します。これは非常に短時間で読み込むには十分です。

Luceneインデックスで保存するテキストはオプションではありませんし、あなただけの、フィードの各別のバッチを分析し、どこかの周波数情報を保存し、インデックスを消去する、メモリ内のインデックスを使用して、単語の頻度に関する情報が必要な場合。また、文書にフィールドを追加する場合は、storeパラメーターをField.Store.NOに設定して、頻度情報のみを格納し、フィールド自体は保管しないでください。

+0

ありがとうございました。しかしLuceneのフィードからのデータの保存は、このデータがデータベースから利用可能であるというビジネス要件のため、現時点では選択肢ではありません。したがって、Luceneは頻度の計算にのみ使用されます。 –

+0

この場合、ディスクストレージを使用することはできますが、メモリ内ストレージの回答に記載されているようにフルテキストは保持しません。フィードのすべての統計情報にアクセスできると同時に、フルテキストをデータベースに保存する、つまりビジネス要件に合わせることができます。 – ffriend

+0

私が現在計画しているのは、Luceneがメモリ内インデックスを使用してタイトルと説明文字列のテキストの頻度を計算し、ハッシュマップに格納することです。次に、タイトルハッシュマップから最も人気のあるx個のキーワードを使用して、説明ハッシュマップから頻度を取得し、これをキーワードごとの頻度として使用します。この段階では、各フィードの実際のデータはすでにデータベースに格納されています。しかし、Luceneを使用して周波数を保存することは、後で取り上げる必要があるため、依然として選択肢です。アドバイスをありがとう。 –

関連する問題