2012-03-17 165 views
1

我有一個概念性問題。減少運行時間

假設我有一個過程(任何語言),它將一個數據集作爲輸入,處理它並將輸出寫入數組。該陣列在流中使用以進一步處理。問題是代碼運行時間很長。這麼大以至於需要優化!

我建議的是將輸入數據集劃分爲更小的塊,併爲每個數據集並行調用過程。聽起來很簡單!

因此我想在獨立的文件中編寫程序,創建一個單獨的可執行文件。提交此可執行文件以用於批量處理的較小數據集。

但是這種方法的問題是,因爲每個批處理作業都是一個單獨的進程,所以這些作業如何創建我之前創建的數組!我可以考慮將每個作業輸出寫入文件,然後處理它們以創建陣列。

有沒有更好的方法可以並行處理?說

感謝您的建議:)

+4

您正在描述[MapReduce](http://en.wikipedia.org/wiki/Map_Reduce)。 – 2012-03-17 01:10:57

+0

感謝您通知。我對此一無所知。任何理想的,如果它可以免費獲得,如果它會使用它很多工作? – Richeek 2012-03-17 01:24:23

回答

1

我認爲它看起來像MapReduce。

您可能想看看Erlang,它支持跨進程,處理器和機器進行分區和分配工作的非常優雅的方式。

Joe Armstrong的Erlang書籍「Programming Erlang - 一個併發世界的軟件」給出了一個簡單的MapReduce,可以跨進程使用。

我發現這些博客這談論喬的簡單的MapReduce:
http://bc.tech.coop/blog/070520.html
http://bc.tech.coop/blog/070601.html
這或許可以解釋的想法,並給出了Erlang的代碼。

Erlang是開源的,所以你可以做一些小實驗。併發性和通信內置於語言中,並且它在一臺機器上「開箱即用」。您需要設置一個「密鑰」以便Erlang虛擬機可以通信,但一旦完成,程序就可以在局域網上運行。

1

由於奧利調查包括你的語言的MapReduce解決方案是一件好事。具體的做法取決於你在理論和技術方面的問題。

以下是一些您可能會考慮回答的問題:您是否有分佈式算法(無中心節點)?我們可以使用中心節點來同步計算嗎(例如在數據庫中)?批處理時間是否足夠小以將文件io視爲長時間?如果是,我們可以使用什麼樣的網絡層?我們是否在一臺計算機上運行,​​並且對IPC有一些需求?

+0

我認爲現在我可以使用更簡單的解決方案,因爲我的程序執行時間遠遠超過文件I/O時間。因此,我可以將所有數據寫入文件,然後通過文件處理合並數據。我不完全有一個分佈式算法。它只是通過將作業提交給不同服務器而在多個輸入數據集上運行的順序算法。 – Richeek 2012-03-20 17:56:43

+0

這是一種分佈式算法。如果你的代碼不是多線程的,也許你可以考慮在每臺計算機上運行你的程序的多個實例來使用所有可用的CPU。 – AsTeR 2012-03-20 18:16:42

+0

是的,這是我會做的......一旦所有的計算都在所有的CPU上完成,我將合併所有生成的文件:-) – Richeek 2012-03-20 18:59:27