程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> lucene並行建索引解決方案

lucene並行建索引解決方案

編輯:.NET實例教程

背景:單線程為30萬條數據建索引花了10分鐘,為了提高效率采用多線程

起初我采用多個線程共享一個indexwriter實例(也意味著往同一個目錄寫索引),這是luceneinaction和lucenewiki的推薦做法,不知道到為什麼總是報FileNotFoundException,很讓人困惑。偶爾會成功一次。這個錯誤讓我想起另外一個問題,就是在建索引的時候搜索也會報這個
錯誤,luceneinaction明明也說了建索引讀的時候沒問題。

言歸正傳,我第二次嘗試使用每個線程單獨擁有自己的indexwriter實例,但往同一個目錄寫索引,果然報了
寫鎖的錯,這和書上說的很一致。

最後沒辦法了,我使用每個線程單獨使用自己的實例,往自己的目錄寫索引,最後一個干完的線程將所有的索引合並比如我開了4個線程,那麼就有5個目錄build_index,build_index1,build_index2,build_index3,build_index4線程1往build_index1中寫,線程往build_index2,。。。依次類推,最後一個干完的將build_index1-4目錄的索引合並到build_index.

我開了4個線程嘗試發現也要花大概7-8分鐘,合並索引的過程非常快20秒左右。
開了10個線程,整個過程需要6分多鐘,合並索引也只花了21秒。

似乎效果並不明顯,這因該是因為數據量還不夠大引起的,數據量越大,並行的優勢會越明顯

可見合並索引的過程非常快,這又提供了另外的好處,我們通常將build_index作為搜索目錄,就像上面說的那樣,建索引的過程會影響搜索(雖然按照書上說是不影響的),如果我們采用這種方案,建索引的絕大部分過程其實與build_index目錄無關,只有最後合並的時候需要用到build_index,但那個過程又非常的快速,所以可以極大的緩解建索引給搜索帶來的問題。

如果條件允許,你可以擴展一下這個方案,將多線程索引升級為多台機器同時建。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved