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

时间:2014-12-26 15:48:43

标签: python mmap hdf5 python-multiprocessing

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

我发现这很难实现,因此这个问题。指针/更正得到赞赏。

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

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

2 个答案:

答案 0 :(得分:1)

mmap +核心驱动程序w / H5py,用于内存中只读访问。我提交了一个针对H5py的补丁,以便在此之前的情况下使用文件映像。不幸的是,它被拒绝了,因为上游不想让用户有能力在脚和安全的缓冲区管理(通过引入的Python缓冲区协议Python 2.7),但这需要改变HDF的方面,我没有得到。尽管如此,如果这对您很重要并且您小心并且能够自己构建pyHDF,请查看补丁/拉取请求here

答案 1 :(得分:1)

我认为情况现在应该更新。

如果需要磁盘文件,Numpy现在有一个标准的专用ndarray子类: numpy.memmap

更新: 在研究了multiprocessing.sharedctypes(CPython 3.6.2 shared memory block allocation code)的实现之后,我发现它总是创建tmp文件为mmap ed,所以不是真正的文件 - 少解决方案。

如果只需要基于纯RAM的共享,有人会用multiprocessing.RawArray演示它: test of shared memory array / numpy integration