Python 将结构化二进制数据一次读取一条记录到numpy缓冲区中
我必须从结构化二进制文件中读取数百万条记录。在阅读时,我想将数据转换成更有用的内存布局。每一张唱片都相当大。总文件大小约为30GB 我可以使用numpy.fromfile,但我运行的系统只有一个完整阵列的足够内存,因此我无法加载整个文件,然后将所有内容复制到内存中的最终阵列,然后销毁最初加载的阵列 我也可以使用numpy.fromfile来读取块,但我担心numpy.fromfile每次都会创建并销毁一个新数组,而不是重用缓冲区数组。我还没有对此进行测试,但我怀疑这会导致一些严重的内存峰值和缓慢的垃圾收集Python 将结构化二进制数据一次读取一条记录到numpy缓冲区中,python,memory-management,numpy,buffer,binaryfiles,Python,Memory Management,Numpy,Buffer,Binaryfiles,我必须从结构化二进制文件中读取数百万条记录。在阅读时,我想将数据转换成更有用的内存布局。每一张唱片都相当大。总文件大小约为30GB 我可以使用numpy.fromfile,但我运行的系统只有一个完整阵列的足够内存,因此我无法加载整个文件,然后将所有内容复制到内存中的最终阵列,然后销毁最初加载的阵列 我也可以使用numpy.fromfile来读取块,但我担心numpy.fromfile每次都会创建并销毁一个新数组,而不是重用缓冲区数组。我还没有对此进行测试,但我怀疑这会导致一些严重的内存峰值和缓慢
在这种情况下:文件是通过infiniband加载的,我在其上运行的分析需要在整个数据集上循环多次。我使用Cython来实现这些循环,因此欢迎使用任何有帮助的C代码,但我更喜欢用Python来完成。根据您的描述,听起来您可以使用它来创建存储在磁盘上的输入二进制文件的内存映射。在大多数方面,np.memmap数组的行为与标准np.ndarray相同。您可以像索引普通数组一样对其进行索引,并将其传递给任何接受np.ndarray的函数。在幕后,您的操作系统将处理读取、缓存和写入二进制文件适当部分的业务,防止您无意中读取太大而无法装入RAM的块 例如,您可以创建第二个memmap来存储输出,然后在核心内存中可以处理的输入memmap的最大片上迭代,随意变换,然后将它们写入输出memmap中的相应位置
如果您正在寻找更好的输出格式来存储数据,我强烈建议您也研究HDF5,例如or,它提供了可移植性、动态压缩和更快的平均读/写时间,以及其他好处。听起来您需要为内存映射文件创建代理。