python共享内存mmap_python -mmap-内存共享

一些工程是用C#编写的,但是用到了机器学习。当前很多框架都是基于python的,他们之间有时候涉及到大量的数据交换,要是能进行内存共享就好了。无论C#还是python将需要交换的数据存入内存,其他程序处理好这些数据后再重写入内存,这样不但方便,而且速度也会提高不少。

其实python中就有一个函数这样的函数mmap来实现内存共享。

内存共享是两个不同的进程共享内存的意思:同一块物理内存被映射到两个进程的各自的进程地址空间。这个物理内存已经被规定了大小(大小一定要比实际写入的东东大)以及名称。当需要写入时,找到内存名称,然后写入内存,等需要读取时候, 首先要知道你要读取多大(因为物理内存比你要读取的东东大,全部读取的话会读到一些“空”的东西),然后寻找对应名称的物理块,然后读取,就是这么简单。

假设a是一个int16的数组:

将a写入内存块

import mmap

import contextlib

mmap_file = mmap.mmap(-1, 4*a.size, access = mmap.ACCESS_WRITE, tagname = 'sharemem')

mmap_file.write(a)

当你想读取的时候:

with contextlib.closing(mmap.mmap(-1, 4*np.array(b).size, tagname='sharemem', access=mmap.ACCESS_READ)) as m:

s = np.frombuffer(m, dtype=np.int)

ok 就这样,你已经实现了内存的共享。

mmap(filedesc, length, tagname='') #windows

mmap(filedesc, length, flag=MAP_SHARED, prot=PROT_READ|PROT_WRITE) #Unix

如果你想指定一个文件file来映射内存,那么参数 filedesc 通常是由 file.fileno()获得,如果在windows中你不想指定哪个文件来映射内存,就想实现共享内存,仅此而已,那么filedesc 可以写“-1”

filedesc = 内存块的大小,一定要大于你写的内容的大小。

Windows中,可以通过参数tagname为一段内存映射指定名称,这样一个文件上面可以同时具有多个 mmap。

Unix平台上,参数 flags的可选值包括:

mmap.MAP_PRIVATE:这段内存映射只有本进程可用;

mmap.MAP_SHARED:将内存映射和其他进程共享,所有映射了同一文件的进程,都能够看到其中一个所做的更改;

参数 prot 对应的取值包括:mmap.PROT_READ, mmap.PROT_WRITE 和 mmap.PROT_WRITE | mmap.PROT_READ。最后一者的含义是同时可读可写。

部分引用:Python多进程(2)--mmap模块与mmap对象 - 王智愚 - 博客园​www.cnblogs.comPython进程间通信之共享内存_kongxx的专栏-CSDN博客_python 共享内存​blog.csdn.netWindows下通过内存映射(mmap)在Python和C++间传输数据(OpenCV/数组)_wangz315的博客-CSDN博客_python mmap windows​blog.csdn.net

你可能感兴趣的:(python共享内存mmap)