Python 快速';记录更新';到二进制文件?

Python 快速';记录更新';到二进制文件?,python,linux,binary,numpy,Python,Linux,Binary,Numpy,我有3000个已知格式的二进制文件(每个文件大小为40[MB])(每个文件有5000000条'int32,float32'记录)。它们是使用numpytofile()方法创建的 我使用的一个方法,whichshouldbeeupdated(),确定应该更新哪个文件(3000个文件中的哪个文件),以及应该更改该文件中的哪些记录。该方法的输出如下所示: (1) path\u to\u file\u name\u to\u update (2) 具有N记录的numpy记录数组(N是要更新的记录数),格

我有3000个已知格式的二进制文件(每个文件大小为40[MB])(每个文件有5000000条'int32,float32'记录)。它们是使用
numpy
tofile()方法创建的

我使用的一个方法,
whichshouldbeeupdated()
,确定应该更新哪个文件(3000个文件中的哪个文件),以及应该更改该文件中的哪些记录。该方法的输出如下所示:

(1)
path\u to\u file\u name\u to\u update

(2) 具有
N
记录的numpy记录数组(
N
是要更新的记录数),格式如下:
[(recordID1,newIntValue1,newFloatValue1),(recordID2,newIntValue2,newFloatValue2),…]

可以看出:

(1) 只有在运行时才知道要更新的文件

(2) 要更新的记录也仅在运行时已知


使用记录的新值更新文件的最有效方法是什么

由于记录的长度是固定的,您只需打开文件,然后
搜索到记录大小和记录偏移量的倍数。要将整数和浮点编码为二进制,可以使用更新:鉴于文件最初是由numpy生成的,最快的方法可能是。

您可能对数据转换不感兴趣,但我对大型二进制文件有很好的经验。HDF5是为大型科学数据集设计的,因此它快速高效。

也许我回答得太早了:记录ID是否偏移到文件中?如果我的recordId=2,这是文件开头的第三条记录吗?如果是这样,seek将起作用,您只需寻找(2*(4+4))并编写8字节压缩结构。是的,文件就是这样安排的。问题是,这是最佳方式吗?使用numpy.fromfile()读取整个文件,然后使用cython扫描数组是否更好?我更新了答案,以链接到numpy.memmap文档。这可能是访问存储在磁盘上的numpy阵列的最有效方法。