使用h5py快速切片.h5文件

时间:2014-05-07 11:29:13

标签: python arrays optimization h5py

我正在使用.h5文件,但经验不足。

在我编写的脚本中,我从.h5文件加载数据。结果数组的形状为:[3584, 3584, 75]。这里值3584表示像素数,75表示时间帧数。加载数据并打印形状需要180毫秒。我使用os.times()获得了这次。

如果我现在想要查看特定时间范围内的数据,请使用以下代码:

data_1 = data[:, :, 1]

切片占用了大量时间(1.76秒)。我知道我的2D数组是巨大的,但在某些时候我想循环时间,这将花费很长时间,因为我在for循环中执行此切片。

是否有更有效/更省时的方式来切割时间范围或处理此类数据?

谢谢!

1 个答案:

答案 0 :(得分:1)

注意:我在这里做了一些假设,因为我不熟悉.H5文件和访问它们的Python代码。

我认为发生的事情是当你“加载”数组时,你实际上并没有加载数组。相反,我认为对象是在文件的顶部构建的。它可能会读取与文件组织方式有关的维度和信息,但它不会读取整个文件。

该对象模拟了一个如此好的数组,以至于当您稍后执行切片操作时,可以执行正常的Python切片操作,但此时正在读取实际数据。这就是为什么与“加载”所有数据相比,切片需要相当长的时间。

由于以下原因,我得出了这个结论。

如果您正在读取75帧3584x3584像素,我假设它们未被压缩(H5似乎只是原始的数据转储),在这种情况下,75 * 3.584 * 3.584 = 963.379.200,这是大约918MB的数据。结合你在180ms内“阅读”这个,我们得到这个计算:

918MB / 180ms = 5.1GB/second reading speed

注意,这个数字是1字节像素,这也不太可能。

因此,这种速度似乎不太可能,因为即使是目前最好的SSD也能达到1GB /秒以下。

似乎更合理的是,对象只是在文件顶部构建,切片操作会导致读取至少1帧数据的成本。

如果我们将速度除以75以获得每帧速度,则对于1字节像素我们获得68MB / sec的速度,而对于24或32位像素,我们获得高达270MB / sec的读取速度。更合理。