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内核。