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

5
我正在尝试从内存缓存(memcached)或网络中加载HDF5数据,并且从多个Python进程中查询它(只读),而不需要制作整个数据集的单独副本。直观地说,我想将映像(与磁盘上显示的相同)mmap到多个进程中,然后从Python中查询它。
我发现这很难实现,因此提出了问题。欢迎指出/纠正错误。

目前探索的思路

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

你能不能不使用RAM磁盘 - Chinmay Kanchi
如果我没记错的话,PyTables和h5py不能正确地处理对单个源的多个连接。因此,如果您想使用PyTables或h5py,则必须为每个进程复制数据。 - Sergeev Andrew
import mmap 后跟 mmap.mmap(...) 是什么意思? - twalberg
2个回答

2
我认为现在应该更新情况了。
如果需要磁盘文件,Numpy现在有一个标准的、专用的ndarray子类:numpy.memmap 更新: 经过查看multiprocessing.sharedctypes的实现(CPython 3.6.2 共享内存块分配代码),我发现它总是创建tmp文件来进行mmap,因此并不是真正的无文件解决方案。
如果只期望纯RAM基础共享,有人使用multiprocessing.RawArray进行了演示: 共享内存数组/NumPy集成测试

1

mmap和核心驱动程序与H5py一起用于内存只读访问。我之前提交了一个修补程序使H5py能够处理文件映像,以满足此类情况的需要。不幸的是,它被拒绝了,因为上游不希望给用户提供危险操作的可能性,也没有c缓冲区协议(Python 2.7引入)的安全缓冲区管理,但这需要对HDF进行更改,在这方面我还没有开始。但如果这对你很重要,并且你有能力构建pyHDF,请查看这个修补程序/拉取请求here


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