目录
1.利用map函数
from multiprocessing import Pool
def process_func(line):
# TODO
# 处理逻辑
return result
with open(all_file,'r') as f:
lines = f.readlines()
print('start preprocess...')
pool = Pool(8)
resultList = pool.map(process_func, lines)
2.数据分片
可以将数据分片处理的任务适合用多进程代码处理,核心思路是将data分片,对每一片数据处理返回结果(可能是无序的),然后合并。缺点是子进程会拷贝父进程所有状态,内存浪费严重。
import math
from multiprocessing import Pool
def process_func(data, index, size): # data 传入数据,index 数据分片索引,size进程数
size = math.ceil(len(data) / size)
start = size * index
end = (index + 1) * size if (index + 1) * size < len(data) else len(data)
temp_data = data[start:end]
# TODO
# 处理逻辑
return result # 可以返回数据,在后面收集起来
resultList = []
p = Pool(8)
for i in range(processor):
resultList.append(p.apply_async(process_func, args=(data, i, processor,)))
print(str(i) + ' processor started !')
p.close()
p.join()
3.文件分片
先把大文件分片保存到磁盘,然后del 释放掉数据,接着在多进程处理的函数里面分别读取,这样子进程就会分别读取需要处理的数据,而不会占用大量内存。
from multiprocessing import Pool
import math
def process_func(i):
data = read_file(data_i) # 自定义读文件逻辑
# TODO
# 处理逻辑
return result
processor=8
p=Pool(processor)
data=load_ori_file() #自定义读取原始文件
l_data = len(data)
size = math.ceil(l_data / processor)
res = []
for i in range(processor):
start = size * i
end = (i + 1) * size if (i + 1) * size < l_data else l_data
data_i = data[start:end]
write_file(data_i) # 自定义写文件逻辑
del data,l_data
for i in range(processor):
res.append(p.apply_async(run, args=(i,)))
p.close()
p.join()