我试图在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 :(得分: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内核上。