2013-10-03 4 views
0

백그라운드 스레드에서 실행되는 "인덱싱 서비스"(WPF 응용 프로그램의 일부로)를 개발 중이고 FileSystemWatcher를 사용하여 일부 파일을 모니터링합니다. 파일 내용이 변경되면 일부 정보를 추출하고 Lucene 색인을 업데이트하려고합니다. 때때로 사용자는 색인에 대해 검색을 수행하려고 할 수 있습니다.Lucene.net 객체의 수명?

사용자가 검색을 수행 할 때마다 색인 판독기를 만들어야합니까? 그리고 인덱스가 업데이트 될 때마다 작가가 있습니까? 또는 싱글 톤 인 인덱싱 서비스 클래스 (싱글 톤)가 싱글 톤 리더 및 라이터 인스턴스 (싱글 톤 FSDirectory, 둘 다 종속성 있음)를 가질 수 있습니까?

싱글 톤 인스턴스를 사용하려면 해당 인스턴스를 닫거나 처리하는 것에 대해 걱정해야합니까? 그렇다면 색인 서비스에서 IDisposable을 구현하고 Dispose()에서 정리를 수행해야합니까?

답변

1

Lucene의 InderWriterIndexReader 인스턴스는 모두 스레드로부터 안전합니다. 이러한 인스턴스를 싱글 톤으로 다시 사용하면 안됩니다. 둘 중 하나의 새 인스턴스를 초기화하는 작업은 극도로 비용이 많이 든다. 비슷한 디자인을 선택하면 쓰기와 검색이 가능하며, 후자의 경우 60 %에 가까워진다.

IndexWriter의 경우 IndexingService을 통해 공개하는 개인 인스턴스 만 유지하면됩니다. IndexReader의 경우 인덱스 변경을 처리 할 수있는 다른 접근 방식이 필요합니다. 소스를 기반으로, 그렇게하면

public class IndexingService 

    ... 

    public IndexReader GetReader() 
    { 
     var reopenedReader = this.reader.Reopen(openReadOnly: true); 
     if (reopenedReader != this.reader) 
     { 
      this.reader.Dispose(); 
      return this.reader = reopenedReader; 
     } 

     return this.reader; 
    } 

this.reader.Reopen에 대한 호출이 먼저 (가 개설 된 이후 변경이 발생하지 않은 경우) 독자가 현재인지 여부를 확인합니다, 그리고, 단순히 그 자체를 반환합니다 할 수 있습니다. 변경 사항이있는 경우 변경된 세그먼트 만로드되며 일반적으로 모든 세그먼트를로드하는 것보다 빠릅니다. 또한 다중 스레드 액세스를 원할 경우 독자와의 액세스를 동기화해야합니다.

마지막으로 한 가지 : 응용 프로그램이 종료 될 때 리소스, 작성자 및 판독기 (Dispose() 메서드 사용)를 모두 처분해야합니다. 그렇게하지 않으면 색인이 손상 될 수 있습니다.

0

매번 작성자를 작성하는 것이 좋지 않으므로 기간을 기다리고 모든 변경 사항을 작성하는 것이 좋습니다. 사용자가 검색을 수행 할 때 변경 사항을 적용 할 수도 있습니다. 실제로 색인 작성이 얼마나 복잡한 지에 따라 다릅니다.

인덱스에 변경 사항을 커밋 할 때 새로운 인덱스 판독기를 만들어야합니다. 그렇지 않으면 변경 사항을받지 않습니다. 따라서 인덱스 작성기에 인덱스 독자를 다시 만들 것입니다. 색인을 업데이트하지 않으면 독자를 다시 만들지 마십시오. 색인이 업데이트되지 않으면 앱이 느려질 수 있습니다.