一次一条记录将结构化二进制数据读入numpy bu

2024-06-16 10:38:18 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

在这种情况下:文件是在infiniband上加载的,我正在对其运行的分析需要我在整个数据集上循环多次。对于这些循环,我使用Cython,所以欢迎使用任何有帮助的C代码,但我更希望用Python完成。在


Tags: 文件数据内存numpy内容系统记录二进制
1条回答
网友
1楼 · 发布于 2024-06-16 10:38:18

从您描述的内容来看,您似乎可以使用^{}来创建存储在磁盘上的输入二进制文件的内存映射。np.memmap数组在大多数方面与标准np.ndarray的行为相同。您可以像普通数组一样索引它,并将其传递给任何接受np.ndarray的函数。在幕后,你的操作系统将处理读取、缓存和写入二进制文件的适当部分的业务,防止你无意中读取一个大到无法放入RAM的块。在

例如,您可以创建第二个memmap来存储输出,然后在核心内存中可以处理的输入memmap的最大部分进行迭代,随意转换它们,并将它们写入输出memmap中相应的位置。在

如果您正在寻找更好的输出格式来存储数据,我强烈建议您也研究HDF5(例如h5pyPyTables),它提供了可移植性、动态压缩和更快的平均读/写时间等优点。在

相关问题 更多 >