0

我正在处理.h5经验不足的文件。

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

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

data_1 = data[:, :, 1]

切片占用大量时间(1.76 秒)。我知道我的 2D 数组很大,但在某些时候我想循环一段时间,因为我在for循环中执行这个切片需要很长时间。

是否有更有效/更省时的方式来分割时间框架或处理此类数据?

谢谢!

4

1 回答 1

1

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

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

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

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

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

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

请注意,此数字适用于 1 字节像素,这也不太可能。

因此,这种速度似乎不太可能,因为即使是当今最好的 SSD 也能达到低于 1GB/秒的速度。

似乎更合理的是,一个对象只是在文件之上构建,并且切片操作会产生读取至少 1 帧数据的成本。

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

于 2014-05-09T08:05:24.577 回答