【问题标题】:using numpy.memmap to map a device file使用 numpy.memmap 映射设备文件
【发布时间】:2011-02-14 02:57:03
【问题描述】:

是否有理由使用 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 特立独行)

更新

好吧,事实证明我可以很好地创建 memmap。问题似乎是,当我关闭进程而不专门关闭 memmap 对象时,它只会挂在内核中的互斥体上。

我不知道这个问题是否与 numpy 或我的内核模块或其他地方有关。

【问题讨论】:

  • 老实说,这可能是 numpy-discussion 上最好的问题。 mail.scipy.org/mailman/listinfo/numpy-discussion 大多数 numpy 开发人员通常不检查 SO。 (我知道的唯一例外是 David Cournapeau……)无论如何,祝你好运!
  • 您更可能遇到的问题是 python mmap 问题,因为 python mmaps 处理 numpy memmaps 的所有内存映射和文件关闭。
  • 奇怪的是python的mmap工作正常。这个我还没想通。

标签: python linux numpy device-driver mmap


【解决方案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 所示,它在取消分配时调用msync。也许这就是你的程序挂起的地方? (您也许可以使用 buffer.flush() 重现您的问题,它也调用 msync)。您首先调用 close() 的解决方案可能有效,因为它绕过了 msync!

【讨论】:

  • 尽管这有点旧,而且我没有解决方案(由于其他项目和工作,我真的停止尝试),无论我做什么,python 的 mmap 都可以工作。只有numpy的memmap被锁定。在我的其他 unix.stackexchange 帖子unix.stackexchange.com/questions/6671/… 上有更多信息,但不直接相关。我将其归结为内核模块错误。而且由于我使用的代码现在已弃用,因此这里的问题应该被视为已关闭。
猜你喜欢
  • 2014-05-28
  • 1970-01-01
  • 2017-06-02
  • 2016-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-18
  • 1970-01-01
相关资源
最近更新 更多