개요는 "루씬 인 액션 p.44"에 나와 있는내용을 그대로 발취 합니다.
전형적인 색인 애플리케이션에서 부하가 가장 많이 절리는 병목 지점은 디스크 상의 색인 파일에 쓰기 작업을 수행할 때이다. 새인 애플리케이션의 진행상태를 추적해보면 색인 파일을 다루는 부분의 코드에서 대부분의 시간을 소비한다는 것을 알 수 있다. 그러므로 새로운 Document를 색인에 추가하거나 존재하는 색인 파일을 변경하는데 있어서 루씬이 좀더 효율적으로 처리하도록 지정할 필요가 있다.
이처럼 메모리 버퍼를 사용하는 이유는 성능면에서 이득이 많기 때문이다. IndexWriter클래스는 메모리 버퍼의 크기와 디스크에 쓰는 빈도수를 설정할 수 있는 몇 개의 인스턴스 변수가 있는데, 변수들을 요약하면 아래와 같다.
indexWriter 변수 | 시스템 속성 | 기본값 | 설명 |
mergeFactor | org.apache.lucene.mergeFactor | 10 | 세그먼트를 병합하는 빈도와 크기를 제어 |
maxMergeDocs | org.apache.lucene.maxMergeDocs | MAX_VALUE | 세그먼트당 문서의 최대 개수 |
minMergeDocs | org.apache.lucene.minMergeDocs | 10 | 색인시 사용되는 램의 양을 제어 |
IndexWriter 클래스의 mergeFactor는 Documnet를 디스크에 쓰기 전에 메모리에 저장할 Document의 개수와 여러개의 색인 내 세그먼트를 병합하는 빈도수를 제어한다. 기본 설정값은 10으로 루씬은 디스크상의 단일 세그먼트에 문서를 쓰기전에 10개의 Document를 메모리에 저장한다. 또한 mergeFactor의 값이 10이라는 건 디스크상의 세그먼트의 전체 개수가 10이 배수가 될 때 모든 세그먼트를 하나로 병합해 최적화한다는 것을 의미하기도 한다.
실제 테스트 결과
윗 내용은 루씬 1.4.3 버전으로 기반으로 설명 되어져 있고, 테스트는 루씬 버전 3.0.2 로 진행하였다.
약 200,000 건의 문서를 대상으로 개인 개발용 PC에서 진행하였다.
1) 기본값 셋팅후 색인 작업 결과
약 23분
2) mergeFactor 값 100으로 증가 후
IndexWriter writer =
new IndexWriter(FSDirectory.open(indexDir), new WhitespaceAnalyzer(), true, IndexWriter.MaxFieldLength.LIMITED);
writer.setMergeFactor(100);
약12분 ... 1)번에 비해 2배 가까이 빨라졌다.
================================================================================
2차테스트 결과
1)번 약 14분 ... 2)번 약 12분 ... 3번 더 테스트 하였으나.. 1분내외 정도의 2번이 우수 즉.. 큰 차이 없음
색인 파일 쪼개기 진행 예정.
'프로그래밍언어 > 패턴, 알고리즘, 프로토콜' 카테고리의 다른 글
파일 읽기 쓰기 락 시간 최대한 줄이기 (0) | 2011.03.16 |
---|---|
안드로이드 에뮬레이터에 한글 자판 설치 하기 (0) | 2011.01.11 |
java.lang.OutOfMemoryError: Java heap space (0) | 2010.10.06 |
CSV (Comma Separated Values) (0) | 2010.07.28 |
구글맵 API (Static Maps API V2) (0) | 2010.07.02 |
댓글