使用numpy.memmap映射设备文件

是否有一个原因,使用numpy的memmap打开设备文件(而不是一个普通的文件)不应该工作?

self.surface = np.memmap('/dev/fb1', dtype=np.uint16, mode='r+', shape=(320,240)) 

我正在使用一个定制的内核模块来添加一个framebuffer设备,这个设备可以和python的常规mmap模块一起工作。 但使用numpy似乎挂在内核的互斥体访问文件系统或什么(我真的不知道到底发生了什么)。

我的问题特别是这是numpy的memmap无法处理的东西,我应该采取不同的方式?

我已经问了关于unix stackexchange的另一个问题,但我觉得这是两个不同的问题,所以我已经发布了他们两个。

显然这是在Linux上(kubuntu定制的内核模块特立独行)

更新

那么,事实certificate,我可以创buildmemmap罚款。 问题似乎是,当我closures进程而没有明确closuresmemmap对象时,它只会挂在内核的互斥体上。

我不知道如果这个问题是与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有它自己的特点。 正如源显示的,它调用了msync的取消分配。 也许这是你的程序挂起的地方? (你也许可以通过buffer.flush()来重现你的问题,这也会调用msync)。 你首先调用close()的解决方案可能是有效的,因为它绕开了msync!