0

我想了解和實現python中的多處理。多處理程序表格計算文件中的行python

作爲示例項目,我試圖計算給定文件中的行數。

我的電腦有4個內核。所以我的目標是爲所有4個內核提供不同的數據塊,並分別計算4個塊中的行數,並將所有4個輸出的總和結尾。

,但我不能下站着如何實現這一

目前我使用下面的代碼,但問題是,我宣佈一個全局變量「i」和所有的內核,如果有一個新的生產線我是遞增i值。

from multiprocessing import Pool 

def process_line(j): 
    return j+1 

i=0 
if __name__ == "__main__": 
    pool = Pool() 
    global i 
    with open('sampleSubmission.csv') as source_file: 
     for l in source_file: 
      i=process_line(i) 
    print i 

我想在這樣的方式,我需要一個單獨的變量爲每一個核心,我想在那個特定的核遇到一個新的生產線,以增加變量。

完成文件處理後,我想添加所有單獨的變量以獲取文件中的行數。

回答

0

你目前的代碼並沒有做任何事情。您正在創建Pool,但未使用它。

迭代文件以將行傳遞給子進程沒有多大意義。您已經完成了在主進程中按行分割文件的所有工作(作爲文件迭代的一部分),因此工作進程沒有任何工作要做。

您可能想要做的事情是將整個文件讀入單個字符串,然後使用該池來計算文件中換行符的數量。 (請注意,這仍然是瘋狂低效的,因爲通過這些字符將大規模支配花在與"\n"比較時的開銷,但它至少會做並行比較有用的東西。)

def worker(character): 
    return character == "\n" # note, True is a fancy version of 1, False is 0 

if __name__ = "__main__": 
    pool = Pool() 
    with open('sampleSubmission.csv') as source_file: 
     text = source_file.read() # read whole file into a string 
    num_newlines = pool.map(worker, text) # strings are iterable, by character 
    print num_newlines + 1 # number of lines is one more than the number of newlines 

你實際上可能如果將其更改爲使用文件的塊而不是單個字符,可以從有點類似的代碼中獲得有用的性能。或者您可以讓工作進程自己讀取文件(從傳遞的偏移量開始),而不是在主進程和工作進程之間傳遞文件的文本。我仍然懷疑這兩種方法中的任何一種都比在單個過程中完成這項工作更快,但您可能會更接近一些。 IO不能很好地並行處理不同的CPU內核。