使用numpy.memmap将设备文件映射到内存

3

为什么使用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、我的内核模块还是其他地方有关。

老实说,这种问题最好在numpy-discussion上询问。http://mail.scipy.org/mailman/listinfo/numpy-discussion 大多数numpy开发者通常不会检查SO。(我知道的唯一例外是David Cournapeau...)无论如何,祝你好运! - Joe Kington
你遇到的问题很可能是一个Python mmap问题,因为Python mmap处理所有内存映射和文件关闭的numpy memmap。 - kiyo
奇怪的是Python的mmap工作正常,我仍然没有弄清楚这个问题。 - Falmarri
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!

虽然这有点老了,而且我没有解决方案(由于其他项目和工作,我真的停止尝试了),但python的mmap无论我做什么都可以工作。只有numpy的memmap会锁死。我的其他unix.stackexchange帖子http://unix.stackexchange.com/questions/6671/how-do-i-debug-a-kernel-module-in-which-a-null-pointer-appears 有更多信息,但并不直接相关。我把这归咎于内核模块错误。由于我使用的代码现在已过时,因此应将此问题视为关闭。 - Falmarri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接