Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用numpy.memmap映射设备文件_Python_Linux_Numpy_Device Driver_Mmap - Fatal编程技术网

Python 使用numpy.memmap映射设备文件

Python 使用numpy.memmap映射设备文件,python,linux,numpy,device-driver,mmap,Python,Linux,Numpy,Device Driver,Mmap,使用numpy的memmap打开设备文件(而不是常规文件)是否不起作用 self.surface = np.memmap('/dev/fb1', dtype=np.uint16, mode='r+', shape=(320,240)) 我正在使用一个自定义内核模块,该模块添加了一个帧缓冲区设备,它可以很好地与python的常规mmap模块配合使用。但是使用numpy似乎会在访问文件系统或其他东西时挂起内核的互斥锁(我真的不确定到底发生了什么) 我的问题是,这是numpy的memmap无法处理的

使用numpy的memmap打开设备文件(而不是常规文件)是否不起作用

self.surface = np.memmap('/dev/fb1', dtype=np.uint16, mode='r+', shape=(320,240))
我正在使用一个自定义内核模块,该模块添加了一个帧缓冲区设备,它可以很好地与python的常规
mmap
模块配合使用。但是使用numpy似乎会在访问文件系统或其他东西时挂起内核的互斥锁(我真的不确定到底发生了什么)

我的问题是,这是numpy的memmap无法处理的事情,我应该走另一条路吗

我在上问了另一个问题,但我觉得这是两个不同的问题,所以我把它们都贴了出来

显然这是在linux上的(kubuntu maverick和自定义内核模块)

更新

事实证明我可以很好地创建memmap。问题似乎是,当我关闭进程而没有特别关闭memmap对象时,它只会挂在内核中的互斥体上


我不知道这个问题是与numpy、内核模块还是其他地方有关。

如果您的代码与python
mmap
模块配合良好,您可以直接使用它而不是
numpy.memmap

>>> fd = os.open("a", os.O_RDWR)
>>> buffer = mmap.mmap(fd, 0)
>>> surface = np.ndarray((320,240), np.uint16, buffer)
这还有另一个优点,即您可以更好地控制所使用的内存映射


现在,python的
mmap
有自己的特点。如图所示,它在delallocation上调用
msync
。也许这就是你的程序挂起的地方?(您可以使用buffer.flush()重现您的问题,它也调用msync)。首先调用close()的解决方案可能会起作用,因为它绕过了msync

老实说,这可能是在讨论numpy时最好问的问题。大多数numpy开发人员通常不会这样检查。(我所知道的唯一例外是大卫·库尔纳佩…)祝你好运,无论如何!您更可能遇到的问题是python mmap问题,因为python mmap处理numpy memmaps的所有内存映射和文件关闭。我还没有弄明白这一点。尽管这有点陈旧,而且我没有解决方案(由于其他项目和工作,我真的停止了尝试),python的mmap不管我做什么都可以工作。只有numpy的memmap被锁定了。关于我的另一篇unix.stackexchange文章,有稍微多一些信息,但与此无关。我把它塞进了内核模块bug。由于我以前使用的代码现在已经被弃用了,这里的问题应该被认为已经解决了。