2012-12-02 2 views
0

솔라 색인 (숫자와 텍스트 필드가 많은 100 개의 필드)에 매우 큰 (크기와 개수의) 문서를 쓰고 있습니다. W7 x64에서 Tomcat 7을 사용하고 있습니다. @ 바탕으로Solrnet/Tomcat 7 - 여러 개의 큰 문서 작성하기 놀랍게 성장하는 메모리 사용량

Maurico의 suggestion when indexing millions of documents I (아래 코드 예제 참조) 쓰기 작업을 병렬

"작업"이 주 (메인 루프에서 밖으로 에드되고 SOLR 방법에 쓰기 : 나는 쓰기 때문에 그것을 밖으로 작업 op가 너무 오래 걸리고 기본 앱을 유지함)

문제는 메모리 소비가 제어 할 수 없게 증가한다는 것이 문제이며, 그 원인은 solr 쓰기 작업입니다. 이 문제를 어떻게 처리합니까? Tomcat을 통해? 또는 SolrNet?

의견을 보내 주셔서 감사합니다.

 //main loop: 
     { 
       : 
       : 
       : 
      //indexDocsList is the list I create in main loop and "chunk" it out to send to the task. 
       List<IndexDocument> indexDocsList = new List<IndexDocument>(); 
       for(int n = 0; n< N; n++) 
       { 
        indexDocsList.Add(new IndexDocument{X=1, Y=2.....}); 
        if(n%5==0) //every 5th time we write to solr 
        { 
        var chunk = new List<IndexDocument>(indexDocsList); 
        indexDocsList.Clear(); 
        Task.Factory.StartNew(() => WriteToSolr(chunk)).ContinueWith(task => chunk.Clear()); 
        GC.Collect(); 
        } 
       } 
     } 

     private void WriteToSolr(List<IndexDocument> indexDocsList) 
     { 

      try 
      { 
       if (indexDocsList == null) return; 
       if (indexDocsList.Count <= 0) return; 
       int fromInclusive = 0; 
       int toExclusive = indexDocsList.Count; 
       int subRangeSize = 25; 

       //TO DO: This is still leaking some serious memory, need to fix this 
       ParallelLoopResult results = Parallel.ForEach(Partitioner.Create(fromInclusive, toExclusive, subRangeSize), (range) => 
       { 
        _solr.AddRange(indexDocsList.GetRange(range.Item1, range.Item2 - range.Item1)); 
        _solr.Commit(); 
       }); 


       indexDocsList.Clear(); 
       GC.Collect(); 
      } 
      catch (Exception ex) 
      { 
       logger.ErrorException("WriteToSolr()", ex); 
      } 
      finally 
      { 

       GC.Collect(); 
      }; 
      return; 
     } 
+0

이 코드는 지나치게 복잡합니다 ... 내 블로그에 게시 한 코드를 사용하지 않는 이유는 무엇입니까? –

+0

@Maurico - 어떤 차이가 있습니까? 나는 다른 병렬 처리 루틴만을 사용하고있다. – Mikos

+0

Tomcat이 많은 기억을 씹고있는 것 같아 근본적으로 잘못된 것을하고 있습니까? – Mikos

답변

3

각 배치 후에 수동으로 커밋됩니다. 이것은 Solr에게 가장 비싼 작업입니다. 귀하의 경우, 매 x 초마다 autoCommit을 권장하고 softAutoCommit (Solr 4.0) 기능을 수행합니다. 그것은 솔르의 사물을 보살펴야한다. JVM 가비지 콜렉션 옵션을 조정해야만 세계 GC를 일시 중지하지 않아도됩니다.