2012-09-14 5 views
2

나는 1740 권의 책 중에서 50571 개의 문서를 가진 Lucene 색인을 가지고 있습니다. 이 색인을 만드는 두 개의 프로세스가 있습니다. 첫 번째 프로세스는 문서별로 장치 문서에 색인을 작성하는 것입니다. 이 과정은 매우 느립니다. 다른 프로세스는 서버에서 책 색인을 작성하는 것입니다 (장치에서 작성하는 것과 완전히 똑같은 방법). 마스터 색인과 함께 다운로드하여 병합하십시오. 이 방법은 마스터 인덱스를 만드는 것이 훨씬 빠릅니다. 색인 생성은 어느 쪽이든 잘 작동합니다.Android Lucene OutOfMemoryExceptoin

문제는 다운로드 - 병합 색인에서 검색 할 때 OutOfMemoryException이 표시되지만 장치에서 생성 된 색인으로 검색 할 때 오류가 발생하지 않습니다. 나는 색인 책을 책 (download-merge)으로 만들고 각 책이 색인 된 후 검색했다. 그것에 기초를 두어 ~ 450에 책을 얻을 때 나는 OutOfMemoryException를 얻기 시작한다.

메모리가 부족한 원인.

+1

현재 코드에서 무엇이 문제를 일으키는 지 말할 수 없습니다. 예외 stacktrace 및 귀하의 질문에 관련된 코드를 추가하십시오. 나는 모든 데이터를 한번에 메모리에 보관하기 위해 어떤 종류의 큰 데이터 구조를 구축했다고 생각합니다. 그 중 하나는 아마도 너무 큽니다. 이 경우 청크로 데이터를 처리하십시오. – zapl

답변

2

Lucene은 메모리 돼지입니다. "병합"색인을 함께 작성할 때 전체 색인 세트를 메모리에 두 번 저장합니다. 루신 documentation에서 인용.

디렉토리의 임시 여유 공간이 필요하며 입력 색인 (시작 색인 포함)의 합계가 2X 까지이어야합니다. 독자/수색자가 시작 인덱스에 대한 열려있는 경우 후 필요한 임시 무료 공간이 많은 메모리가 시작 인덱스

의 크기에 의해 더 높을 것이다. 이를 줄이기 위해 색인 작성기에서 forceMerge(int)을 호출하여 색인 크기를 줄여야합니다. 이것은 느린 프로세스이지만 인덱스의 크기를 줄입니다. 색인 디렉토리에 50 개 이상의 파일이있을 때마다이 파일을 1이라는 인수로 호출합니다.