从大型二进制文件读取数据的任何有效方法?

lim*_*imi 4 python binary file

我需要在一个二进制文件中处理数十GB的数据.数据文件中的每条记录都是可变长度的.

所以文件是这样的:

<len1><data1><len2><data2>..........<lenN><dataN>
Run Code Online (Sandbox Code Playgroud)

数据包含整数,指针,双精度值等.

我发现python甚至无法处理这种情况.如果我在内存中读取整个文件没有问题.它很快.但似乎struct包装并不擅长性能.它几乎坚持解压缩字节.

任何帮助表示赞赏.

谢谢.

Ale*_*lli 5

struct并且array,其他答案建议,对于实现的细节是好的,如果您的需求总是按顺序读取所有文件或其前缀,可能就是您所需要的.其他选项包括缓冲区,mmap,甚至是ctypes,具体取决于您未提及的有关您的确切需求的许多细节.如果没有合适且可访问的库(在C,C++,Fortran等中)已经存在,可以为了处理这个庞大的文件而进行接口,那么也许一个专门的Cython编码助手可以提供您所需的所有额外性能.你需要.

但显然这里存在一些特殊问题 - 例如,数据文件如何包含指针,这些指针本质上是一个与寻址内存相关的概念?它们可能是"抵消",如果是这样,它们究竟是如何基于和编码的?您的需求是否比简单的顺序读取(例如,随机访问)更先进,如果是这样,您是否可以执行第一次"索引"传递以将所有从文件开始到记录开始的偏移变为更可用,更紧凑的,手工格式化的辅助文件?(偏移二进制文件将是一个自然的array-除非偏移量必须长于array!你的机器上的支持).记录长度和组成的分布以及构成"数十千兆字节"的记录数量是多少?等等

你有一个非常大规模的问题(毫无疑问是非常大规模的硬件支持它,因为你提到你可以轻松地将所有文件读入内存,这意味着一个带有几十GB RAM的64位盒子 - 哇!)因此,优化其处理的详细护理非常值得 - 但除非我们了解足够的细节,否则我们对这种详细的护理无能为力! - ).