使用numpy.memmap映射设备文件
有没有什么原因导致用numpy的memmap打开设备文件(而不是普通文件)不行呢?
self.surface = np.memmap('/dev/fb1', dtype=np.uint16, mode='r+', shape=(320,240))
我在使用一个自定义的内核模块,这个模块添加了一个帧缓冲设备,使用python的普通mmap
模块时一切正常。但是用numpy的时候,似乎在访问文件系统时会让内核的互斥锁卡住(我也不太确定到底发生了什么)。
我想问的是,numpy的memmap是不是处理不了这种情况,我是不是应该换个方法?
我在unix stackexchange上问过另一个问题,但我觉得这两个问题不太一样,所以我把它们都发出来了。
显然这是在linux系统上(kubuntu maverick,带有自定义内核模块)
更新:
结果我发现我可以正常创建memmap。问题似乎是当我关闭进程时,没有特别关闭memmap对象,这样就会让内核的互斥锁卡住。
我不知道这个问题是出在numpy上,还是我的内核模块上,或者其他地方。
1 个回答
2
如果你的代码在使用 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
模块也有它自己的一些特别之处。正如源代码所示,它在释放内存时会调用 msync
。也许这就是你的程序卡住的原因?(你可能可以通过调用 buffer.flush() 来重现这个问题,因为它也会调用 msync)。你先调用 close() 的解决方案可能有效,因为这样就绕过了 msync!