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

如何将HDF5数据映射到多个Python进程中?,python,mmap,hdf5,python-multiprocessing,Python,Mmap,Hdf5,Python Multiprocessing,我试图从内存缓存(memcached)或网络中加载HDF5数据,然后从多个Python进程中查询(只读),而不制作整个数据集的单独副本。直观地说,我希望将映像(它将显示在磁盘上)映射到多个进程中,然后从Python中查询它 我发现这很难实现,因此提出了这个问题。感谢指点/更正 到目前为止,我已经探讨了一些想法 pytables-这看起来是最有前途的,它支持查询HDF5数据的丰富接口,而且它(与numpy不同)似乎可以处理数据,而无需制作数据的(进程本地)副本。它甚至支持一个方法File.get

我试图从内存缓存(memcached)或网络中加载HDF5数据,然后从多个Python进程中查询(只读),而不制作整个数据集的单独副本。直观地说,我希望将映像(它将显示在磁盘上)映射到多个进程中,然后从Python中查询它

我发现这很难实现,因此提出了这个问题。感谢指点/更正

到目前为止,我已经探讨了一些想法
  • pytables-这看起来是最有前途的,它支持查询HDF5数据的丰富接口,而且它(与numpy不同)似乎可以处理数据,而无需制作数据的(进程本地)副本。它甚至支持一个方法
    File.get\u File\u image()
    ,该方法似乎可以获取文件图像。我不知道如何从内存映像而不是磁盘文件构造新的文件/文件节点
  • h5py-获取HDF5数据的另一种方法,与pytables一样,它似乎需要一个磁盘文件。选项driver='core'看起来很有希望,但我看不出如何在其中提供现有的mmap'd区域,而不是让它分配自己的区域
  • numpy-一种较低级别的方法,如果我通过mmap共享我的原始数据,那么我可能能够构建一个可以访问此数据的numpy数据阵列。但是相关的构造函数
    ndarray.\uuuu new\uuuuu(buffer=…)
    说它将复制数据,并且numpy视图似乎只能从现有的ndarray而不是原始缓冲区构建
  • ctypes-非常低级别的方法(可能使用多处理的
    包装器来提供一些帮助)。如果我直接使用ctypes,我可以毫无疑问地读取我的mmap数据,但我将丢失所有结构信息以及numpy/pandas/pytables提供的查询帮助
  • 分配磁盘空间-我可以只分配一个文件,写出所有数据,然后在所有进程中通过Pytable共享。我的理解是,这将是内存高效的,因为pytables不会复制(直到需要时),而且显然进程将共享底层文件映像的操作系统磁盘缓存。我的反对意见是,它很难看,将磁盘I/O引入到我想要的纯内存系统中

mmap+核心驱动程序w/H5py,用于内存只读访问。不久前,我为H5py提交了一个补丁,用于处理像这样的场景中的文件图像。不幸的是,它被拒绝了,因为upstream不想让用户在脚和安全缓冲区管理(通过引入的c缓冲区协议Python2.7)中射击自己,但这需要改变HDF的方面,我还没有谈到。尽管如此,如果这对您很重要,并且您非常小心并且能够自己构建pyHDF,请查看补丁/拉取请求,我认为现在应该更新情况

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

更新: 在研究了
multiprocessing.sharedTypes
(CPython 3.6.2)的实现之后,我发现它总是创建要
mmap
ed的tmp文件,因此它不是一个真正的无文件解决方案

如果只需要基于纯RAM的共享,则有人已使用multiprocessing.RawArray对其进行了演示:

如果我没记错,pytables和h5py无法正确处理到单个源的多个连接,您是否可以不使用。因此,如果要使用pytables或h5py,则必须为每个进程制作一份数据副本。
import mmap
后跟
mmap.mmap(…)