2012-07-02 112 views
2

Win 7/SolrNet 0.4.0/C#winforms.net 4.0客戶端。solrnet - solr.Add(doc)瓶頸

我正在使用Solrnet和winforms線程應用程序將多個位圖和一些數學描述符寫入Solr實例(在不同的服務器上)。有趣的是solr.Add方法似乎顯着減慢了應用程序。即如果我註釋掉增加的提交方法,CPU利用率會跳到90%左右,但是在它們工作的情況下,CPU利用率大約爲20% - 但是看起來文檔正在寫入Solr。

這是預期的行爲? Solr寫的是瓶頸嗎?我該如何解決這個問題?

  var doc = new IndexDocument 
      { 
       _UUID = Guid.NewGuid().ToString(), 
       _FileName = (FileName), 
      }; 

      //// Bitmap is not thread safe we Need to make a copy for each Task and done so synchronously.    
      Bitmap[] blobCopies = MakeBlobCopies(bmpBlob, 2); 

      Task<List<KeyValuePair<string, double>>>[] descriptorTasks = new Task<List<KeyValuePair<string, double>>>[2]; 
      descriptorTasks[0] = Task.Factory.StartNew<List<KeyValuePair<string, double>>>(() => ApplyDescriptor1(blobCopies[0])); 
      descriptorTasks[1] = Task.Factory.StartNew<List<KeyValuePair<string, double>>>(() => ApplyDescriptor2(blobCopies[1])); 

      Task.WaitAll(descriptorTasks); 
      foreach (var t in descriptorTasks) 
      { 
       List<KeyValuePair<string, double>> flds = t.Result; 
       foreach (KeyValuePair<string, double> fld in flds) 
       { 
        Type type = doc.GetType(); 
        if (!String.IsNullOrEmpty(fld.Key)) 
        { 
         SetPropertyValue(doc, fld.Key, fld.Value); 
        } 
       } 
      } 

      DisposeBlobCopies(blobCopies); 

      solr.Add(doc); 
      solr.Commit(); 

回答

3

solr調用可能是您的應用程序的瓶頸,因爲他們阻止io命中。添加和提交是對restful api的2個不同的調用。我幾乎肯定solrnet在他們的api中沒有本地支持來執行異步調用,但是看起來您知道如何使用任務並行庫。使呼叫不被阻塞,事情應該加速。您可能會發現有必要控制併發量。

+0

Thaks爲小費。我將solr.Add方法移動到任務Task.Factory.StartNew (()=> solr.Add(doc));並顯着改善了事情。 – Mikos

+0

@Mikos進行此更改後,您獲得的速度(每分鐘的文檔)是多少?你改變了什麼?我們正面臨類似的問題,並按照您的建議嘗試使用Task.Factory,但似乎並沒有提高索引速度。 – Krunal