Python 使用numpy.memmap映射设备文件
使用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无法处理的
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。由于我以前使用的代码现在已经被弃用了,这里的问题应该被认为已经解决了。