在Python中读取二进制文件:读取某些字节耗时很长

0 投票
3 回答
1804 浏览
提问于 2025-04-15 19:18

这件事真奇怪

我正在用Python的numpy库读取一些(确实非常大的:每个大约2GB)二进制文件。

thingy = np.fromfile(fileObject, np.int16, 1)

这个方法是在一个嵌套循环的中间进行的——我每个“通道”循环执行4096次,而这个“通道”循环对于每个“接收器”又执行9次,这个“接收器”循环执行4次(每个接收器有9个通道,总共有4个接收器!)。这对于每个“块”来说,大约每个文件有3600个块。

所以你可以想象,这个过程非常重复,我知道会花费很长时间,但实际花的时间比我预期的要长得多——平均每个“块”要8.5秒。

我用time.clock()等方法做了一些基准测试,发现一切运行得都很快,除了每个“块”中大约1到2个样本(也就是在4096*9*4中1或2个)似乎会“卡住”几秒钟。现在,这应该只是从二进制中返回一个简单的int16,不应该花费几秒钟……为什么会卡住呢?

从基准测试中我发现,每次卡住的地方都是一样的(例如:块2,接收器8,通道3,样本1085就是其中之一,供参考!),而且每次卡住的时间大致相同。

有什么想法吗?!

谢谢,

Duncan

3 个回答

1

是不是因为列表的垃圾回收机制在起作用呢?

补充一下:这些数据是有趣的数据,还是块号?如果你随机读取这些块,会发生什么呢?

r = range(4096)
random.shuffle(r)  # inplace
for blockno in r:
    file.seek( blockno * ... )
    ...
2

你把结果存在哪里呢?当列表、字典或者其他数据结构变得非常大时,重新分配和调整它们的大小可能会导致明显的延迟。

3

虽然没有具体的例子很难判断,但这听起来像是一个缓冲的问题。最开始的部分是被缓冲的,所以在你还没到达缓冲区的末尾时,速度是很快的;然后速度就会变慢,直到下一个缓冲区填满,接着又会重复这个过程。

撰写回答