如何将HDF5数据映射到多个Python进程?

gxm*_*xmw 5 python mmap hdf5 python-multiprocessing

我试图从内存缓存(memcached)或网络加载HDF5数据,然后从多个Python进程查询它(只读),而不需要单独复制整个数据集.直观地说,我想将图像(就像它出现在磁盘上)映射到多个进程中,然后从Python中查询它.

我发现这很难实现,因此这个问题.指针/更正表示赞赏.

到目前为止我已经探索过的想法

  • pytables - 这看起来最有前途,它支持用于查询HDF5数据的丰富界面,它(不像numpy)似乎可以处理数据而无需制作(进程本地)数据副本.它甚至支持一种File.get_file_image()似乎可以获取文件图像的方法.我没有看到如何从内存映像而不是磁盘文件构造新的File/FileNode.
  • h5py - 另一种获取HDF5数据的方法,就像使用pytables一样,它似乎需要一个磁盘文件.选项driver ='core'看起来很有希望,但是我看不到如何在其中提供现有的mmap'd区域,而不是让它自己分配.
  • numpy - 一种较低级别的方法,如果我通过mmap共享我的原始数据,那么我可能能够构建一个可以访问这些数据的numpy ndarray.但相关的构造函数ndarray.__new__(buffer=...)表示它将复制数据,而numpy视图似乎只能从现有的ndarray构建,而不是原始缓冲区.
  • ctypes - 非常低级的方法(可能使用多处理的Value包装器来帮助一点).如果我直接使用ctypes,我可以毫无问题地读取我的mmap'd数据,但是我会丢失所有的结构信息,并从numpy/pandas/pytables中查询它.
  • 分配磁盘空间 - 我可以只分配一个文件,写出所有数据,然后在我的所有进程中通过pytables共享它.我的理解是这将是内存效率,因为pytables不会复制(直到需要),显然这些进程将共享底层文件映像的操作系统磁盘缓存.我的反对意见是丑陋并将磁盘I/O带入了我想成为纯粹的内存系统.

Jas*_*ton 1

mmap + 带 H5py 的核心驱动程序,用于内存中只读访问。我不久前提交了一个 H5py 补丁,用于处理此类场景的文件图像。不幸的是它被拒绝了,因为上游不想给用户搬起石头砸自己脚的能力和安全的缓冲区管理(通过Python 2.7引入的c缓冲区协议),但这需要改变HDF的一面,而我还没有抽出时间。不过,如果这对您很重要并且您很小心并且有能力自己构建 pyHDF,请查看此处的补丁/拉取请求