2012-07-13 4 views
3

현재 약 5 천만 개의 문서가있는 Solr 인스턴스가 있습니다. Solr 정렬, precisionStep 및 메모리 사용

<fieldType name="long" class="solr.TrieLongField" precisionStep="0" omitNorms="true" positionIncrementGap="0"/> 
<field name="row" type="long" indexed="true" stored="true" /> 

가 정렬을하고 오는

은, 인덱스가 메모리에로드 될 필요가 : 우리는 종종 정렬하는 precisionStep 제로와 표준 long 필드 유형을 사용하여 long 필드가 있습니다. 우리의 경우, row 값의 범위가 넓기 때문에 정렬을 수행하는 데 500m에서 1g 사이의 힙이 필요합니다.

이 메모리 사용 요구 사항을 어떻게 든 줄일 수 있는지 궁금합니다.

row 필드의 precisionStep이 증가하면 인덱스 크기가 감소하여 정렬에 필요한 메모리가 줄어들습니까? 속도를 분류하는 것과 비교할 때 트레이드 오프가 있습니까? 그리고 더 높은 정밀도의 단계 (행 값은 엄격하게 정렬되어야 함)로 여전히 완전히 일치 할 것입니까?

1GB의 힙은 현재 상당히 수용 가능하지만 더 많은 문서를 더 많이 추가하면 더 많은 메모리가 필요합니다. row 값이 너무 높아질 수 있습니다. 이 현재 메모리에 맞는 동안


은 (jpountz의 대답 후에 추가)

, 그것은 늘 우리가 다음 몇 개월을 추가 할 것으로 예상되는 문서의 수에 따라 확장 할 수 있습니다. Solr에서 결과를 정렬하지 않고 디스크 기반의 java-merge-sort으로 클라이언트 측에서 정렬합니다.

답변

2

precisionStep 매개 변수는 범위 쿼리에만 관련이 있습니다. 정렬을 수행하려면 Lucene은 field cache에 필드 값을로드해야합니다. 8 바이트가 길면 필드에 대한 필드 캐시에 약 8B * 50M ~ 400MB가 필요합니다. 이 필드의 길이가 길어지면 메모리 사용량을 줄이는 방법이 없습니다. 반면에 int를 사용하면 ~ 200MB 만 필요합니다.