【问题标题】:multiprocessing program form calculating lines in a file python多处理程序形式计算文件python中的行
【发布时间】:2016-06-16 05:19:21
【问题描述】:

我正在尝试在 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 

我想要这样一种方式,即我需要为每个核心使用一个单独的变量,并且我想在该特定核心遇到新行时增加该变量。

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

【问题讨论】:

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


    【解决方案1】:

    您当前的代码没有并行执行任何操作。您正在创建 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 内核上并行化。

    【讨论】:

      猜你喜欢
      • 2019-10-24
      • 2022-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-01
      • 2019-01-08
      • 1970-01-01
      相关资源
      最近更新 更多