2012-02-24 22 views
0

上のJavaヒープ領域エラーが発生し、私は、Apache LuceneのJavaのでインデックス化されている(約30万レコード、少なくとも26個のフィールドを持つそれぞれ)。のLucene:IndexSearcher.searchは()私は非常に大規模なデータベースを持っている非常に大規模なデータベース

私は2つのフィールドからクエリを構築しています。各検索用語は9つのフィールドのいずれかに表示されます。検索用語の両方がドキュメントの関連フィールドに表示されている場合、クエリでドキュメントを返すようにします。クエリは、そのように構成されています

Private Query CreateQuery(String theSearchTerm, String theField) throws ParseException 
{ 
    StandardAnalyzer theAnalyzer = new StandardAnalyzer(Version.LUCENE_35); 
    Query q; 
    QueryParser qp = new QueryParser(Version.LUCENE_35, theField, theAnalyzer); 
    qp.setDefaultOperator(QueryParser.Operator.AND); 
    qp.setAllowLeadingWildcard = true; 
    q = qp.parse(theSearchTerm); 
    return q; 
} 

Public ScoreDoc[] RunTheQuery(String searchTerm1, String searchTerm2) 
{ 
    Directory theIndex = new SimpleFSDirectory(new File("C:\\MyDirectory"); 
    IndexSearcher theSearcher = new IndexSearcher(InderReader.open(theIndex)); 

    BooleanQuery theTopLevelBooleanQuery = new BooleanQuery(); 

    BooleanQuery fields1 = new BooleanQuery(); 
    BooleanQuery fields2 = new BooleanQuery(); 
    BooleanQuery fields3 = new BooleanQuery(); 
    BooleanQuery fields4 = new BooleanQuery(); 
    BooleanQuery fields5 = new BooleanQuery(); 
    BooleanQuery fields6 = new BooleanQuery(); 
    BooleanQuery fields7 = new BooleanQuery(); 
    BooleanQuery fields8 = new BooleanQuery(); 
    BooleanQuery fields9 = new BooleanQuery(); 

    BooleanQuery innerQuery = new BooleanQuery(); 

    fields1.add(CreateQuery(searchTerm1, param1), BooleanClause.Occur.MUST); 
    fields1.add(CreateQuery(searchTerm2, param2), BooleanClause.Occur.MUST); 
    fields2.add(CreateQuery(searchTerm1, param3), BooleanClause.Occur.MUST); 
    fields2.add(CreateQuery(searchTerm2, param4), BooleanClause.Occur.MUST); 
    fields3.add(CreateQuery(searchTerm1, param5), BooleanClause.Occur.MUST); 
    fields3.add(CreateQuery(searchTerm2, param6), BooleanClause.Occur.MUST); 
    fields4.add(CreateQuery(searchTerm1, param7), BooleanClause.Occur.MUST); 
    fields4.add(CreateQuery(searchTerm2, param8), BooleanClause.Occur.MUST); 
    fields5.add(CreateQuery(searchTerm1, param9), BooleanClause.Occur.MUST); 
    fields5.add(CreateQuery(searchTerm2, param10), BooleanClause.Occur.MUST); 
    fields6.add(CreateQuery(searchTerm1, param11), BooleanClause.Occur.MUST); 
    fields6.add(CreateQuery(searchTerm2, param12), BooleanClause.Occur.MUST); 
    fields7.add(CreateQuery(searchTerm1, param13), BooleanClause.Occur.MUST); 
    fields7.add(CreateQuery(searchTerm2, param14), BooleanClause.Occur.MUST); 
    fields8.add(CreateQuery(searchTerm1, param15), BooleanClause.Occur.MUST); 
    fields8.add(CreateQuery(searchTerm2, param16), BooleanClause.Occur.MUST); 
    fields9.add(CreateQuery(searchTerm1, param17), BooleanClause.Occur.MUST); 
    fields9.add(CreateQuery(searchTerm2, param18), BooleanClause.Occur.MUST); 

    innerQuery.add(fields1, BooleanClause.Occur.SHOULD); 
    innerQuery.add(fields2, BooleanClause.Occur.SHOULD); 
    innerQuery.add(fields3, BooleanClause.Occur.SHOULD); 
    innerQuery.add(fields4, BooleanClause.Occur.SHOULD); 
    innerQuery.add(fields5, BooleanClause.Occur.SHOULD); 
    innerQuery.add(fields6, BooleanClause.Occur.SHOULD); 
    innerQuery.add(fields7, BooleanClause.Occur.SHOULD); 
    innerQuery.add(fields8, BooleanClause.Occur.SHOULD); 
    innerQuery.add(fields9, BooleanClause.Occur.SHOULD); 

    theTopLevelBooleanQuery.add(innerQuery, BooleanClause.Occur.MUST); 

    TopDocScoreCollector collector = TopDocScoreCollector.create(200, true); 

    //Heap space error occurs here 
    theSearcher.search(theTopLevelBooleanQuery, collector); 

    ScoreDoc[] hits = collector.topDocs().scoreDocs; 
    return hits; 
} 

私の問題は、私はIndexSearcher.search()メソッドを呼び出したときに、サーバー(Windows Server 2003 R2)上のjava.exeプロセスが以上540メガバイトを消費することこれはJavaヒープ・スペース・エラーが発生します。完成のために、JavaアプリケーションはWebサーバー(現在はOracle Glassfish、Apache Tomcatに移行する予定ですが)で実行されています。

誰もがこのヒープ領域のエラーを停止する方法のアイデアを持っていますか? StackOverflowポスト(http://stackoverflow.com/questions/7259736/cant-open-lucene-index-java-heap-space)は同様の問題に対処しているようですが、詳細な答えは実際にはありません。

は、Javaプロセスが使用できるメモリの量を増加させる唯一の答えですか?新しい検索ユーザーを作成する唯一の答えは誰ですか、軽量検索ユーザーについての良い記事をお勧めしますか?

は、上記のコードを変更することによってこの問題を解決する方法はありますか?すべてのヘルプは感謝して受信されるだろう

、 おかげで、 のRik

+0

は、あなたが私たちを提供することができますどのような割り当てがOutOfMemoryErrorを引き起こしたかを見ることができるスタックトレース? – jpountz

答えて

関連する問題