使用numpy.memmap映射设备文件

3 投票
1 回答
2200 浏览
提问于 2025-04-16 11:46

有没有什么原因导致用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!

撰写回答