0

这很奇怪

我正在使用 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 就是其中之一,记录在案!),并且它会卡在那里大约相同的时间每次运行的时间。

有任何想法吗?!

谢谢,

邓肯

4

3 回答 3

3

虽然很难说没有某种可重现的样本,但这听起来像是一个缓冲问题。第一部分是缓冲的,直到你到达缓冲区的末尾,它很快;然后它会减慢直到下一个缓冲区被填满,依此类推。

于 2010-02-15T12:52:19.570 回答
2

您将结果存储在哪里?当列表/字典/任何东西变得非常大时,需要重新分配和调整大小时可能会出现明显的延迟。

于 2010-02-15T15:00:05.420 回答
1

可能是垃圾收集正在启动列表吗?

补充:是有趣的数据,还是 blockno ?如果你按照随机顺序阅读这些块会发生什么

r = range(4096)
random.shuffle(r)  # inplace
for blockno in r:
    file.seek( blockno * ... )
    ...
于 2010-02-15T18:03:32.740 回答