2013-04-28 61 views
5

所以,我在發佈這篇文章之前回顧了大量的文章和論壇,但是我一直在閱讀衝突的答案。首先,操作系統不是問題,我可以使用Windows或Unix,無論對我的問題最好。我有大量的數據需要用於只讀目的(不知道爲什麼這很重要,但是,如果是這樣,我將不得不經歷的數據結構是一組數組哈希值的數組也是數組)。我基本上將一個「查詢」與大量不同的「句子」進行比較,並計算它們的相對相似性。從這些數量(幾百萬)中,我想獲得最高的x%,並與他們一起做些事情。我需要將這個過程並行化。對於我來說,減少空間沒有什麼好的方法 - 我需要比較一切以獲得好的結果,而且它會花費太長的時間來處理某些線程/分支。我再次看到許多相互矛盾的答案,不知道該怎麼做。Threading vs Forking(解釋我想做什麼)

任何幫助,將不勝感激。提前致謝。

編輯:我不認爲內存使用量將是一個問題,但我不知道(8 GB RAM)

+1

的Perl吃比預期更多的內存。在你走之前,試着加載你的數據結構,看看會花多少錢,結果可能讓你感到驚訝。 – 2013-04-28 00:57:12

+0

我在這裏沒有看到問題。 – jordanm 2013-04-28 01:16:20

+0

問題是,我應該使用什麼:線程或分叉? – 2013-04-28 02:54:26

回答

16

沒有關於你的問題的更多細節,沒有太多可以給予的幫助。你想並行化一個進程。 Perl中的線程和叉具有優點和缺點。

使Perl線程不同於其他線程的關鍵之一是數據在默認情況下不被共享。這使得線程更容易和更安全地工作,您不必擔心庫或線程的大部分代碼,線程安全。然而,它可能是一個性能拖拽和內存餓,因爲Perl必須將解釋器和所有加載的模塊的副本放入每個線程中。

說到分叉,我只會談論Unix。 Perl使用線程模擬Windows上的fork,它可以工作,但它可能很慢並且很麻煩。

分叉優點

  • 非常快創建一個叉
  • 非常健壯

分岔缺點

  • 進程間通信可以是SLO w和尷尬

線程優勢

  • 線程協調和數據交換是相當容易
  • 線程是相當容易使用

主題缺點

這最後一個是位如果文檔是最新的,則可以使用它。如果你要做大量的SQL,不要使用線程。

一般來說,要獲得良好表現出來的Perl線程這是最好的開始線程池並重新使用它們。叉子可以更容易地創建,使用和丟棄。

真的什麼它歸結爲是什麼適合你的思維方式和你的特殊問題。

對於這兩種情況下,你可能會想要的東西來管理你的工人的儲備。對於分叉,你會想要使用Parallel::ForkManagerChild。孩子特別好,因爲它內置了進程間通信。

對於您想要使用的線程threads::shared,Thread::Queue和閱讀perlthrtut

當閱讀有關Perl的線程的文章,請記住他們是有點廢話,當他們在5.8.0在2002年推出的,只有5.10.1維修。之後,他們已經相當穩固。關於他們的效率和健壯性的信息和意見往往會迅速過時。

+0

非常感謝! – 2013-04-28 03:30:18

+1

優秀的答案。 – squiguy 2013-04-28 03:47:44

+1

['use use;'](http://metacpan.org/module/forks) – Zaid 2013-04-28 08:02:59

0

線程可能更難以得到正確的,但不會使用盡可能多的記憶。

分叉可以更容易實現,但使用大量的內存。

如果你沒有任何經驗,我會開始執行分叉版&從那裏去。

+2

在Perl中完全是另一種方式。 – Schwern 2013-04-28 03:10:59

+0

那麼,你會建議穿線?由於線程會完全獨立工作,直到他們吐出結果,我是否甚至需要使用'join()'之類的東西? – 2013-04-28 03:16:21

相關問題