2011-09-28 22 views
6

我有一個Ruby腳本讀取一個巨大的表(~20米行),做一些處理,並將其提供給Solr索引的目的。這是我們流程中的一大瓶頸。我打算在這裏加快速度,並希望達到某種平行度。我對Ruby的多線程性質感到困惑。我們的服務器有 ruby 1.8.7 (2009-06-12 patchlevel 174) [x86_64-linux]。從this blog postthis question at StackOverflow可以看出,Ruby沒有「真正的」多線程方法。我們的服務器有多個內核,因此使用parallel gem似乎是另一種方法。紅寶石並行/多線程編程來讀取龐大的數據庫

我該用什麼方法?此外,任何有關並行數據庫讀取饋送系統的輸入都將受到高度讚賞。

+0

你如何訪問數據庫?你能告訴我們一些代碼嗎? –

+0

我使用mysql gem每次使用MySQL的限制,偏移量參數來獲取N(〜500)條記錄。批量處理它們並批量將它們提供給Solr。需要更多信息? –

回答

1

是否有升級到Ruby 1.9的機會?它通常比1.8.7更快。

確實,Ruby患有GIL,但如果多線程能夠解決您的問題,那麼您可以看看JRuby,因爲它支持真正的線程。

此外,你最好確保它是CPU的瓶頸,因爲如果它是I/O多線程可能不會給你買太多。

4

您可以在操作系統級別對其進行並行化。更改腳本,使其可以從輸入文件中取出一系列行

$ reader_script --lines=10000:20000 mytable.txt 

然後執行腳本的多個實例。

$ reader_script --lines=0:10000 mytable.txt& 
$ reader_script --lines=10000:20000 mytable.txt& 
$ reader_script --lines=20000:30000 mytable.txt& 

Unix會自動將它們分發到不同的內核。

+0

這似乎是一個合理的方法。我們有8個內核,所以我可以輕鬆運行多達8個實例。 –

+0

關於'reader_script'的任何文檔?我找不到任何。 – Chamnap