Python多进程进行文件预处理

目录

 

1.利用map函数

2.数据分片

3.文件分片


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()

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值