2010-11-23 136 views
3

我在我想處理的數據庫中有許多記錄。基本上,我想運行幾個正則表達式替換文本字符串行的標記,並在最後,並將它們寫回數據庫。關於python multiprocessing的初學者問題?

我想知道多處理是否會加快完成這些任務所需的時間。 我做了

multiprocessing.cpu_count

,並返回8.我已經試過類似

process = [] 
for i in range(4): 
    if i == 3: 
     limit = resultsSize - (3 * division) 
    else: 
     limit = division 

    #limit and offset indicates the subset of records the function would fetch in the db 
    p = Process(target=sub_table.processR,args=(limit,offset,i,)) 
    p.start() 
    process.append(p) 
    offset += division + 1 

for po in process: 
    po.join() 

但顯然,所花費的時間比運行所需的時間更高一個單一的線程。這是爲什麼?有人可以請指教這是一個合適的情況下,或者我在這裏做錯了什麼?

+0

你真的用4次迭代來測試它嗎?產生每個過程需要時間。另外,postgresql每個連接只使用一個cpu。所以它可能只是排隊4個查詢並按順序運行它們。另外,根據啓動每個查詢的開銷,拆分工作可能無益。另外,還有一些東西只依賴於你的系統,比如後臺進程和你正在運行的硬件。 – 2010-11-23 02:33:09

+0

@nate,我用4測試它。我認爲我每個進程使用1個連接,但.. – goh 2010-11-23 04:38:37

回答

1

這裏有幾個問題:

  1. 在你processR功能,它在同一時間發出聲音了大量的從數據庫記錄,抑或是一次讀取1行? (每行獲取成本非常高,性能也很好。)

  2. 它可能不適用於您的特定應用程序,但由於您正在處理「所有內容」,因此使用數據庫可能會比平面文件慢。數據庫針對邏輯查詢進行了優化,而非針對性處理。在你的情況下,你可以將整個表格列導出爲CSV文件,處理它,然後重新導入結果?

希望這會有所幫助。

5

這是爲什麼?

有人可以請啓發在什麼情況下多處理提供更好的表現?

這裏有一個技巧。

多處理只有當你的瓶頸是一個資源,這是不是共享資源。

共享資源(如數據庫)將被拉到8個不同的方向,這幾乎沒有什麼實際好處。

要查找非共享資源,您必須擁有獨立的對象。就像已經在記憶中的列表一樣。

如果你想從一個數據庫工作,你需要得到8件事情開始,然後沒有更多的數據庫工作。因此,將工作分配到不同處理器的中央查詢有時可能是有益的。

或8個不同的文件。請注意,文件系統 - 作爲一個整體 - 是共享資源,某些類型的文件訪問涉及共享類似磁盤驅動器或目錄的文件。

或8個較小步驟的管道。標準的unix管道技巧query | process1 | process2 | process3 >file比其他任何東西都更好,因爲管道中的每個階段都是完全獨立的。

這是另一個竅門。您的計算機系統(操作系統,設備,數據庫,網絡等)非常複雜,以致於簡單的理論根本無法解釋性能。你需要(a)進行多次測量,(b)嘗試幾種不同的算法,直到你理解了所有的自由度。

一個問題,例如「有人可以在多處理的情況下提供更好的性能,請指教嗎?」沒有一個簡單的答案。

爲了有一個簡單的答案,你需要一個更簡單得多的操作系統。更少的設備。例如,沒有數據庫和網絡。由於您的操作系統很複雜,因此您的問題沒有簡單的答案。

1

一般來說,當你的問題受到CPU限制時(即大部分時間CPU運行速度儘可能快),multicpu或多核處理最有幫助。

從你的描述來看,你有一個IO綁定問題:從磁盤到CPU(空閒)需要永久性的處理,然後CPU操作非常快(因爲它非常簡單)。

因此,加速CPU的運行並沒有造成很大的差異。