一次python多进程编程的尝试

本文介绍了如何使用Python的多进程编程优化数据处理和绘图流程。作者首先描述了单进程操作下处理大量数据的耗时问题,然后采用队列实现数据处理进程和绘图进程的并行,通过进程池进一步提高效率。在优化过程中,作者遇到了进程终止条件的问题,并给出了解决方案,最终将总时间从40分钟缩短到450秒左右。
摘要由CSDN通过智能技术生成

我们有一批raw data 文件(二进制文件),需要把这批文件读入之后处理成正常数据,并经过几步操作后存成dict的形式,每个key对应一个一维numpy矩阵,然后把这个dict存成pkl文件。处理完之后,我们需要调用matplotlib来把pkl文件中某一个或某几个key对应的numpy矩阵画出来。

初始的做法是,我挨个读入raw data,处理成pkl文件;等所有的raw data都被处理完成之后,使用matplotlib把所有的pkl文件一个一个地画出来。对这个流程计时,发现读入数据并将其转换成可用数据用了600多秒;几步操作共用了300多秒;画图用了1300多秒。整个流程耗时接近40分钟。而这仅仅是很短的一部分数据。以后数据量如果大起来,这个处理速度显然是不行的。

于是并行操作成为了必然的选择。刚开始想得也比较简单,由于画图占用的时间过长,超过了读入和处理数据加起来的时间总和,因此可以考虑两个进程,一个用来读入和处理数据并将处理好的数据存为pkl,另一个用来画图。这样的操作需要画图进程时刻去检查数据处理进程有没有处理好一个新的raw data并生成新的pkl文件。

这个需求很容易想到应该使用队列。具体来说,数据处理进程每次处理好一个raw data文件并生成对应pkl文件之后,将这个pkl文件的路径推进一个队列q;画图进程不断检查这个队列q,如果q非空,就使用q.get()得到一个pkl文件的路径,然后载入这个pkl文件并画图;如果q空了,可能有两种情况,一种是画图进程画得比较快,在数据处理进程还未处理好一个新的文件的时候,画图进程已经把队列里所有的pkl文件都画完了;另一种是所有文件都已经被处理完了,应该结束了。为了区别这两种情况,我们需要设置一个终止条件,满足终止条件则退出程序,否则继续循环,等待数据处理进程给q推进新的pkl文件路径。

这个思路的部分伪代码如下:

import multiprocessing as mp
import os
from pathlib import Path
from time import time

import matplotlib.pyplot as plt
import numpy as np

import utils # 一个自己写的工具包


class Process:
    def __init__(self, input_path, mid_path, plot_path):
        self.input_path = Path(input_path)  # raw data文件位置

        self.mid_path = Path(mid_path)      # 创建pkl文
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值