2011-04-20 2 views
4

문서 추가 및 검색에 대한 기본적인 이해가 있다고 가정 해 보겠습니다.Lucene.NET 평생 관리

IndexWriter 및 IndexReader 인스턴스를 관리하는 가장 좋은 방법은 무엇입니까?

현재 내 응용 프로그램은 IndexWriter의 싱글 톤 인스턴스를 만듭니다. 내가 검색을 할 필요가 그 어느 때, 난 그냥 새로운 IndexReader를 생성하는 것은 메모리에로드 얻을 수있는 인덱스가 발생하기 때문에 나는이 일을하고 다음

var searcher = new IndexSearcher(writer.GetReader()) 

를 사용하여 IndexWriter에서 IndexSearcher를 만든 다음 기다립니다 GC가 메모리를 재 할당합니다. 이로 인해 메모리 부족 오류가 발생했습니다.

현재 구현이 이상적인 것으로 간주됩니까? 이 구현으로 메모리 문제는 해결되었지만 항상 존재하는 write.lock 파일에 문제가 있습니다 (IndexWriter는 항상 인스턴스화되고 열리기 때문에). 다음은 앱에서 얻은 오류의 스택 추적입니다.

잠금 시간이 초과되었습니다 얻 NativeFSLock의 @의 C : \을 Inetpub \ wwwroot에 \ htdocs_beta \ App_Data products3의 \의 write.lock \ System.IO.IOException : 파일 'C에 액세스 할 수 없습니다 과정 : \ inetpub \ wwwroot \ htdocs_beta \ App_Data \ products3 \ write.lock ' 프로세스에서 사용 중이므로 입니다. System.IO.FileStream.Init에서 System.IO .__ Error.WinIOError (INT32 의 errorCode, 문자열 maybeFullPath) (문자열 경로, 하는 FileMode 모드, FileAccess 액세스, INT32 권리, 부울 useRights, 파일 공유 공유, INT32 BUFFERSIZE에서 , FileOptions 옵션 SECURITY_ATTRIBUTES의 secAttrs, System.IO.FileStream..ctor에서 문자열 msgPath, 부울 bFromProxy, 부울 useLongPath) (문자열 경로, 대한 fileMode 모드, Lucene.Net.Store에서 FileAccess 액세스). NativeFSLock.Obtain()

검색을 위해 IndexSearcher의 싱글 톤 인스턴스를 만든 다음 필요에 따라 메모리에 IndexWriter를 만드는 것이 가장 좋습니다. 이렇게하면 인덱스를 업데이트 할 때 write.lock 파일이 생성/삭제됩니다. 필자가 볼 수있는 유일한 문제는 IndexSearcher 인스턴스가 구식이 될 것이므로 인덱스가 업데이트 된 경우 IndexSearcher를 다시로드하는 작업을 실행해야합니다.

당신은 어떻게 생각하십니까?

어떻게 실시간 업데이트로 큰 색인을 처리합니까?

답변

1

잠금 문제를 피하려면 인덱스 작성기를 하나만 사용해야합니다. 다음을보십시오 : Lucene.Net writing/reading synchronization

+0

질문을하는 사람은 이미 색인 작성자가 한 명이라 제안했기 때문에 대답으로 도움이되는지 확신 할 수 없습니다. – Bittercoder