본문 바로가기

Lucene

[lucene] Indexing Speed 향상


메일링 리스트에 참고 될 만한 자료가 있길래..
한번 정리해 봅니다.

(영어가 짧아 오역이 있을 수 있습니다.. 지적해주세요 ^^)

원문은
http://wiki.apache.org/lucene-java/ImproveIndexingSpeed
여기에 있습니다.

1. 정말로 스피드 향상이 필요한지 확인해보라.

2. 최종 버젼을 사용하라.

3. 로컬 파일 시스템을 사용하라. - 네트워크 파일 시스템을 사용하지 말라.

4. 좀 더 빠른 하드웨어, 특히 빠른 IO 시스템

5. Writer는 하나만 생성하고 인덱스 세션 동안 재사용하라.

6. Flush는 document count가 아닌 RAM 사용량으로 하라.
- > 2.3에서 IndexWriter는 RAM 사용량에 따라서 자기 스스로 flush를 할 수 있다.
wirter.setRAMBufferSizeMB() 메서드는 버퍼의 사이즈를 셋팅 할 수 있다.

7. 가용한 RAM을 가능한 많이 사용하라

8. compound file format을 사용하지 말라.
-> setUseCompoundFile(false) 메서드를 통해 인덱싱 시간을 7 ~ 33% 까지 줄일 수 있다. 하지만 이것은 색인과 검색시 파일 디스크립터가 굉장히 증가한다. mergeFactor가 같이 크다면 더욱 커질 것이다.

9. Document와 Field instance를 재사용하라.
-> GC 코스트를 줄일 수 있다.

10. Analyzer에서 하나의 Token 인스턴스만을 사용하라.

11. Token 클래스의 Token Text를 나타내기 위해 String API 대신 char[] API 를 사용하라.
-> Token 인스턴스의 재사용을 위함.

12. IndexWriter를 open 할 때 autoCommit=false로 지정하라.
-> 하지만, searcher는 IndexWriter가 close 될 때 까지 , IndexWriter에 의해 변경되는 사항들을 반영 할 수 없다는 것을 주의

13. 작고 많은 text fields를 인덱싱 하는 대신에 , 하나의 contents 필드에 텍스트를 모으고 인덱싱하라.

14. mergeFactor를 증가시키되, 적당히 ...
-> mergeFoctor의 값이 크면 segments의 merging 타이밍을 늦추고, 이것은 인덱싱 스피드를 증가시킨다. 하지만 이것은 검색 시간을 늦출 것이고, 너무 크면 file descriptor 갯수를 초과 할 수 있다.

15. 쓰지 않는 필드는 지워라.

16. 더 빠른 Analyzer를 사용하라.

17. 정말 필요할때 까지 (검색 속도가 너무 느릴때..) optimize를 하지 말라

18. 하나의 IndexWriter를 멀티 쓰레드로 사용하라.

19. 여러 인덱스로 인덱스하고 그다음에 합쳐라.

-> 인덱스 대상이 매우 크다면 인덱스를 나누고, 각각 인덱싱을 한 후 writer.addIndexesNoOptimize를 사용해 하나의 인덱스로 합쳐라.

20. 자바 프로파일러를 활용하라.

일단 당장 적용 해 볼 수 있는 것이..
mergeFactor 조절과 Analyzer 튜닝, compoundFile 옵션과 Optimize 주기 설정
싱글턴 패턴으로의 전환 등이 있겠네요.

생각보다 많은 방법이 있네요.. 기본적인 것부터.. 하드웨어적인것 까지..^^