是否有理由使用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 with custom kernel module)
更新:
嗯,事实证明我可以很好地创建memmap。看起来问题是,当我关闭进程而没有专门关闭memmap对象时,它只会挂在内核中的互斥锁上。
我不知道这个问题是关于numpy,还是我的内核模块,还是其他地方。
答案 0 :(得分:1)
如果您的代码与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
有自己的特点。正如source所示,它会在delallocation上调用msync
。也许这是你的程序挂起的地方? (您可以使用buffer.flush()重现您的问题,也可以调用msync)。你首先调用close()的解决方案可能有效,因为它绕过了msync!