Python中如何并行化图像读取函数,处理数据科学项目的16000张图片
Python并行批量读取图像实现方案
前置说明
- 5000张图像读取时Jupyter崩溃,核心原因是大量图像对象同时加载到内存产生的峰值内存超过系统可用阈值,并行实现前可先做内存占用评估:单张3通道1080P RGB图像约占6MB内存,5000张对应峰值占用约30GB,超过24GB内存上限时无论串行并行都会触发内存溢出,建议读取同时叠加resize、灰度转换等预处理操作降低内存占用,或采用分批读取处理的模式。
- Python多进程采用内存复制模式,不要在进程执行函数中引用不必要的全局大对象,避免额外内存开销。
- 优先选择joblib实现,语法更简洁,无需手动管理进程池,适配成本最低。
方案1:基于joblib实现并行读取
直接复用你现有的read_img函数即可,实现代码如下:
import matplotlib.image as mpimg import numpy as np from joblib import Parallel, delayed def read_img(name): try: img = mpimg.imread(name) return img except: return "Did not find image" # 替换为你的16000张图像的路径列表 img_path_list = [...] # 并行执行,返回结果顺序与输入路径顺序完全一致 img_list = Parallel(n_jobs=12, verbose=10)( delayed(read_img)(path) for path in img_path_list ) # 过滤读取失败的结果,只保留有效图像数组 img_list = [img for img in img_list if isinstance(img, np.ndarray)]
参数说明:
n_jobs=12:对应你的12核CPU,也可设置为-1自动调用所有可用核心verbose=10:打印执行进度,方便排查卡顿问题,不需要可直接删除- 逻辑和C++中OpenMP的并行for循环类似,自动处理进程池的创建、调度、销毁,无需手动管理底层逻辑。
方案2:基于multiprocessing实现并行读取
如果需要对进程调度做更底层的控制,可使用multiprocessing的进程池实现:
import matplotlib.image as mpimg import numpy as np from multiprocessing import Pool def read_img(name): try: img = mpimg.imread(name) return img except: return "Did not find image" if __name__ == "__main__": # 替换为你的16000张图像的路径列表 img_path_list = [...] # 初始化12进程的进程池 with Pool(processes=12) as pool: img_list = pool.map(read_img, img_path_list) # 过滤读取失败的结果 img_list = [img for img in img_list if isinstance(img, np.ndarray)]
注意事项:
- Windows环境下必须将执行逻辑放在
if __name__ == "__main__"代码块中,否则会触发进程创建报错 - Jupyter环境下建议优先使用joblib方案,避免multiprocessing的上下文适配问题
性能优化建议
- 替换
mpimg.imread为cv2.imread或PIL.Image.open,读取速度可提升30%以上,内存占用也更低,仅需对应修改read_img函数的实现即可 - 内存不足时可将16000张图像分为4批,每批4000张并行读取,读完一批处理后释放内存再读取下一批,避免内存峰值过高
内容的提问来源于stack exchange,提问作者Devansh Sharma
相关产品推荐
相关产品推荐

