2017-08-25 4 views
1

Apache Tikaを使用してPDFファイルからテキストコンテンツを抽出し、索引付けのためにLuceneにデータを渡そうとしています。Luceneの索引付けのためのPDFからテキストを効率的に抽出する

public static String extract(File file) throws IOException, SAXException, TikaException { 

     InputStream input = new FileInputStream(file); 
     ContentHandler handler = new BodyContentHandler(-1); 
     Metadata metadata = new Metadata(); 
     new PDFParser().parse(input, handler, metadata, new ParseContext()); 
     String plainText = handler.toString(); 
     input.close(); 
     return plainText; 
    } 

私のクエリを呼び出し

handler.toString()に関連しています。

ここでは、複数のスレッド(ユーザーが設定可能な4〜8)を使用して抽出プロセスを実行しています。だから私たちが索引付けの目的でLuceneに与えることができるストリームを得る他の方法があります。なぜなら、私は巨大なStringsがより大きなヒープを求めていると感じているからです。

現在、指標として行う場合:私たちは50メガバイトに50キロバイトから様々なサイズの約500Kの文書を抽出し、インデックスする必要が

doc.add(new TextField(fieldName, ExtractPdf.extract(file), Field.Store.NO)); 

答えて

1

私は以前Apache Tikaで作業していませんでしたが、あなたの質問は面白かったので、私は周りを見回しました& toString()が問題の根本原因であるとは思われません。私の理解あたりとして

- あなたはいつもあなたがNの一部のみのボディを取得した場合ORあなたのプログラムロジックが正常に動作することができますに関係なく任意のサイズのテキストビーイングのFULL BODYのTEXTが必要な場合は効率が決定することによって達成することができます-LENGTH

私はあなたが常にフルテキストのテキストを必要とし、あなたのプログラムは部分的なボディでは機能しないので、あなたが達成できるすべての効率(フルテキストが必要な場合)は大きな文字列図のようにhereセクションにチャンクでプレーンテキストをストリーミングカスタムコンテンツハンドラデコレータでストリーミングします。だから、メモリ賢明な、あなたのプログラムはまだそのような大きな体を格納することが可能であるべきではなく、あなたの体は、インデックスのあなたの下流のプロセスを簡素化するかもしれないチャンクに分割されます。

あなたのプログラムは、サポートされている最大のファイルサイズに応じてメモリ要件を列挙しなければならず、この方法では救済できません。だから、どのくらいの大きさのファイルを扱いたいのかということは非常に早い段階での決定です。

他のオプションは、同じファイルを複数回解析して効率的ではないプロセスを開発しているようです(可能なアプローチとして示唆し、Tikaで実行可能かどうかはわかりません)。

ああは....長々と書き込みアップ:)

がポイント上に言って、あなたはまた、あなたが各ステップに異なるチューニングと構成を提供することができるように&インデックス手順を解析するファイルを分離しようとする必要があることに注意してください。

一般的なプロデューサ - コンシューマパターンは、スレッドセーフブロッキングキューを使用してコード化することも、Spring Batch APIとすることもできます。

春のバッチで、あなたの読者は、ファイルを解析&を読み取るための責任を負うことになります、読者はプロセッサに文字列のリストに渡しますし、文字列の一覧の一覧はライターに行くと作家は、単にインデックスますあなたのチャンクサイズ設定に応じて大量のファイルはほとんどありません。

Lucene IndexWriterはスレッドセーフなクラスであり、ファイル解析レベルでマルチスレッドを使用することに加えて、複数のスレッドを使用して高速なインデックス作成を行うことができるので、デカップリングが必須です。

希望すると助かります!

はまた、その抑留されていない場合、Javaの文字列ゴミ、任意の通常のオブジェクトのように詳細な回答のためsee

+0

感謝を集めていることに注意してください。ファイルの内容全体を索引付けまたは解析する必要があると想定するのは間違いありません。スレッドをより速くするために実装しました。私は非常に興味深いようにチャンクオプションをチェックする必要があります。 GCがトリガーされ、クリーンアップが適切に実行されていますが、私の実際の目的は、ヒープ使用量のスパイク数を減らすことです。テストシナリオでは、ヒープ使用量は1 GBまで増えますが、すべてのインデックス作成プロセスが完了した後で実際の使用量は20 MBになる可能性があります。チャンクのアプローチを確認して確認します。解決した場合は、これを回答としてマークします – Soumya

関連する問題