首页 > 系统相关 >Python3.8多进程共享内存之Numpy数组

Python3.8多进程共享内存之Numpy数组

时间:2022-11-12 19:45:41浏览次数:70  
标签:tmp rad ts vpd 进程 共享内存 Numpy shm Python3.8

在利用python处理数据的时候,想要充分发挥CPU的算力,可以选择利用多进程来实现。如果子进程内存占用较大的话,往往很难多开进程,如果不涉及对内存的写入操作,那么多个子进程共享内存,则可以减少内存的开销,多开子进程提高处理速度。

下面针对Python3.8多进程中共享Numpy数组进行记录

主要参考:

Python3.8多进程之共享内存 - 知乎 (zhihu.com)

Python 多进程编程《*》:shared_memory 模块-pudn.com

multiprocessing.shared_memory --- Shared memory for direct access across processes — Python 3.11.0 文档

内存共享的目标是为了提高多进程通信的效率,因此在实践中,应该在每一进程中初始化一个SharedMemory实例对象,这些对象应该指向同一共享内存块。另外某些子进程可能会早于其它进程结束,因此在进程退出时,应该调用该进程内的 SharedMemory实例对象的close()方法——切断SharedMemory实例对象与共享内存块的连接。当所有进程都不在需要访问共享内存时,应该在最后一个退出进程中调用SharedMemory实例对象的unlink()方法——回收共享内存块。

利用multiprocessing shared_memory模块,主要思路为,在父进程开辟一块共享内存,然后在子进程中通过父进程中共享内存的名称对其进程访问与操作。

具体代码示例如下:


# -*- coding: utf-8 -*-
"""
Created on Wed Nov  9 14:06:37 2022

@author: pan
"""

import os
import time
import numpy as np
from osgeo import gdal
from scipy import signal
import json
import multiprocessing as mul
from multiprocessing.shared_memory import SharedMemory
from multiprocessing.managers import SharedMemoryManager
import tracemalloc

def main_samp_extract(pars):
    a,b,c = pars[0],pars[1],pars[2]
    # Locate the shared memory by its name
    shm_tmp_child = SharedMemory(name=shm_tmp_name, create=False)
    shm_rad_child = SharedMemory(name=shm_rad_name, create=False)
    shm_vpd_child = SharedMemory(name=shm_vpd_name, create=False)
    # Create the np.ndarray from the buffer of the shared memory
    tmp_ts = np.ndarray(shape_tmp, dtype_tmp, buffer=shm_tmp_child.buf)
    rad_ts = np.ndarray(shape_rad, dtype_rad, buffer=shm_rad_child.buf)
    vpd_ts = np.ndarray(shape_vpd, dtype_vpd, buffer=shm_vpd_child.buf)
    return a+b+c

if __name__ == '__main__':
        tmp_ts = np.random.rand(365,14,14)
        rad_ts = np.random.rand(365,14,14)
        vpd_ts = np.random.rand(365,14,14)
        # Start tracking memory usage
        tracemalloc.start()
        start_time = time.time()
        # 将以上数据设置为共享内存,子进程可以使用
        with SharedMemoryManager() as smm:
            # Create shared memory of size ndarray.nbytes
            shm_tmp = smm.SharedMemory(size=tmp_ts.nbytes)
            shm_rad = smm.SharedMemory(size=rad_ts.nbytes)
            shm_vpd = smm.SharedMemory(size=vpd_ts.nbytes)
            # Create a np.ndarray using the buffer of shared memory
            shm_tmp_ts = np.ndarray(tmp_ts.shape, dtype=tmp_ts.dtype, buffer=shm_tmp.buf)
            shm_rad_ts = np.ndarray(rad_ts.shape, dtype=rad_ts.dtype, buffer=shm_rad.buf)
            shm_vpd_ts = np.ndarray(vpd_ts.shape, dtype=vpd_ts.dtype, buffer=shm_vpd.buf)
            # Copy the data into the shared memory
            np.copyto(shm_tmp_ts, tmp_ts)
            np.copyto(shm_rad_ts, rad_ts)
            np.copyto(shm_vpd_ts, vpd_ts)

            ##打开10个进程池,开始进行运算
            pool = mul.Pool(10)
            rel = pool.map(main_samp_extract, parameters)    
            pool.close()#关闭进程池,不再接受新的进程
            pool.join()#主进程阻塞等待子进程的退出    
            print(rel)


        # Check memory usage
        current, peak = tracemalloc.get_traced_memory()
        print(f"Current memory usage {current/1e6}MB; Peak: {peak/1e6}MB")
        print(f'Time elapsed: {time.time()-start_time:.2f}s')
        tracemalloc.stop()  

整体上是这么一个思路

标签:tmp,rad,ts,vpd,进程,共享内存,Numpy,shm,Python3.8
From: https://www.cnblogs.com/yhpan/p/16884484.html

相关文章

  • Numpy 基础教程之Numpy的介绍
    1.多维数组介绍Numpy(NumericalPython的简称),是Python数值计算最重要的基础包之一,大多数提供科学计算的包都以Numpy的ndarray(多维数组)为构建基础。下面我们就通过一些......
  • 〖TensorFlow2.0笔记22〗使用Numpy在MNIST数据集上实现3层BP神经网络!
    使用Numpy在MNIST数据集上实现3层BP神经网络!本文章是TensorFlow2.0学习笔记系列,欢迎关注该,专栏链接:​​TensorFlow2.0学习笔记​​,文章会持续更细,多希望大家点赞收藏......
  • pkl中list,tensor, numpy占内存的大小
    pickle中可以存储list,tensor,array类型的数据但是tensor占的内存要比list和array大的多经测试,存储nuscenemini数据集的参数信息,tensor:39Marray:23Mlist:......
  • Numpy与Pandas简介
    一、Numpy与Pandas是什么?Numpy(NumericalPython)是Python语言的一个第三方库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。Numpy是一个运行......
  • Linux共享内存通信的C语言Demo代码
    重点注明:本文代码来源于:https://blog.csdn.net/github_38294679/article/details/122360026  =====================================================  使用p......
  • Numpy 基础教程之Numpy的介绍
    1.多维数组介绍Numpy(NumericalPython的简称),是Python数值计算最重要的基础包之一,大多数提供科学计算的包都以Numpy的ndarray(多维数组)为构建基础。下面我们就通过一些......
  • Android 共享内存(ashmem)持续更新
    Android共享内存(ashmem)前言项目中接入讯飞语音合成,在sdk中看到MemoryFile,了解下用法发现,看到的只是冰山一角。官方介绍:SharedMemoryenablesthecreation,mapping,and......
  • numpy.random.uniform()
    函数原型:numpy.random.uniform(low,high,size)功能:从一个均匀分布[low,high)中随机采样,注意定义域是左闭右开,即包含low,不包含high.参数介绍:low:采样下界,float类......
  • 深度学习实战——numpy手写梯度下降法对价格进行预测
    导包准备importnumpyasnpimportpandasaspdimportjdcimportmatplotlib.pyplotaspltimportseabornassns#Visualization算法梯度求导公式对应的梯度计算,a代表学......
  • numpy常用方法
    声明一个张量importnumpyasnpA=np.array([[0,2,4,7],[2,4,6,9],[1,3,7,0]])观察形状、数据结构print(A.shape)print(A.dtype)索引第0行第三个数pr......