多处理程序形成计算文件python中的行

时间:2016-03-03 03:39:13

标签: python python-2.7 python-3.x parallel-processing multiprocessing

我试图在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 

我想以这样一种方式,我需要为每个核心提供一个单独的变量,并且我希望在特定核心遇到新行时增加变量。

完成文件处理后,我想添加所有单独的变量以获取文件中的总行数。

1 个答案:

答案 0 :(得分: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内核上。