0

インデックス作成と検索に CLucene を使用しています。作成されたインデックス ファイルは 5 GB を超えています。CLucene 検索用の個別の dll を作成しました。DLL コンストラクターには次のコードが含まれています

lucene::index::IndexReader ptrIndexReader;
lucene::search::IndexSearcher searcher; these are defined in class decalaration/

ptrIndexReader = IndexReader::open(pDir.c_str(),false,NULL);
searcher = new IndexSearcher(ptrIndexReader);

コードが次のような検索関数を 1 つ使用します

bool LuceneWrapper::SearchIndex(wstring somevalue)
{
    lucene::analysis::KeywordAnalyzer fAnalyzer;

    Document doc = NULL;

    Hits hits = NULL;

    Query f_objQuery = NULL;

    NistRecord *f_objRecords = NULL;

    bool flag = false;

    try{
       if (ptrIndexReader == NULL)
       {
          return NULL;
       }
       // Initialize IndexSearcher
       wstring strQuery = _T("+somename:") + somevalue;
       // Initialize Query Parser, with Keyword Analyzer

       QueryParser *parser = new QueryParser( _T(""),&fAnalyzer);
       // Parse Query string

       f_objQuery = parser->parse(strQuery.c_str());
       // Search Index directory

       hits = searcher->search(f_objQuery);

       //searcher.

       int intHitCount =   0;
       intHitCount  = hits->length; 

       if(intHitCount > 0)
       {    
           if(doc!=NULL)
              delete [] doc;
           flag =  true;
       }

       //searcher.close();
  }
  catch(CLuceneError& objExp)
  {
      if(doc!=NULL)
          delete  doc;
      return false;
  }

  if(hits!=NULL)
      delete hits;

  if(f_objQuery!=NULL)
      delete f_objQuery;

  return flag ;
}

非常に多くの値を検索しています。レコード数に応じて、メイン メモリはどんどん高くなり、オン レベルでは 2 GB 近くになり、アプリケーションがクラッシュします。誰がこれの何が悪いのか教えてもらえますか? メモリが非常に多くなり、アプリケーションがクラッシュするのはなぜですか?

4

1 に答える 1

1

割り当てを解除することはありませんparser

動的に割り当てる理由がわかりません。
なぜあなたはちょうど言わないのですか

 QueryParser parser( _T(""), &fAnalyzer);
 f_objQuery = parser.parse(strQuery.c_str());

また、例外が発生した場合は、f_objQueryとの両方を必ず削除する必要があります。アクセスできる場合は、ここでお手伝いします。hits
std::unique_ptr

(そして、NULL をあまりテストする必要はありませんdelete。null ポインターには問題ありません。)

于 2013-09-11T14:23:01.663 に答える