将结构化二进制数据一次读入numpy缓冲区

时间:2015-02-28 19:25:26

标签: python memory-management numpy buffer binaryfiles

我必须从结构化二进制文件中读取数百万条记录。在阅读时,我想将数据转换为更有用的内存布局。每条记录都很大。文件总大小约为30GB。

我可以使用numpy.fromfile,但我正在运行的系统只有一个完整数组的内存,因此我无法加载整个文件,然后将所有内容复制到最终数组在内存中,然后销毁最初加载的数组。

我也可以使用numpy.fromfile来读取块,但我担心numpy.fromfile每次都会创建并销毁一个新数组,而不是重用缓冲区数组。我还没有测试过这个,但我怀疑这会导致一些严重的内存峰值和缓慢的垃圾收集。

如果这适用:文件是通过infiniband加载的,我在其上运行的分析要求我遍历整个数据集多次。我使用Cython进行这些循环,所以任何可以提供帮助的C代码都是受欢迎的,但我更愿意用Python完成它。

1 个答案:

答案 0 :(得分:0)

根据您的描述,听起来您可以使用np.memmap为存储在磁盘上的输入二进制文件创建内存映射。在大多数方面,np.memmap数组的行为与标准np.ndarray相同。您可以像对待普通数组一样对其进行索引,并将其传递给任何接受np.ndarray的函数。在幕后,您的操作系统将处理读取,缓存和编写二进制文件的相应部分的业务,防止您无意中读取太大而无法放入RAM的块。

然后,您可以创建第二个memmap来存储输出,然后遍历您可以在核心内存中处理的输入memmap的最大切片,然后根据需要对它们进行转换,并将它们写入相应的位置。输出memmap。

如果您正在寻找更好的输出格式来存储数据,我强烈建议您同时查看HDF5(例如h5pyPyTables),它提供便携性,实时压缩和更快的平均读/写时间,以及其他好处。