我正在尝试从内存缓存(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带入了我想要成为纯内存系统的领域。
import mmap
后跟mmap.mmap(...)
是什么意思? - twalberg