【问题标题】:Fast 'Record Update' To Binary Files?快速“记录更新”到二进制文件?
【发布时间】:2011-03-11 04:09:26
【问题描述】:

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

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

(1)path_to_file_name_to_update

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

可以看出:

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

(2) 要更新的记录也只在运行时才知道

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

【问题讨论】:

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

标签: python linux binary numpy


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您可能对数据转换不感兴趣,但我在使用HDF5pytables 处理大型二进制文件方面有很好的经验。 HDF5 专为大型科学数据集而设计,因此快速高效。

    【讨论】:

      猜你喜欢
      • 2011-10-29
      • 1970-01-01
      • 2018-03-23
      • 1970-01-01
      • 2016-08-22
      • 2021-04-21
      • 2011-09-27
      • 1970-01-01
      • 2019-01-27
      相关资源
      最近更新 更多