使用h5py快速切片.h5文件
我正在处理 .h5
文件,但经验不多。
在我写的一个脚本中,我从一个 .h5
文件中加载数据。加载后得到的数组形状是: [3584, 3584, 75]
。这里的 3584
表示像素的数量,而 75
表示时间帧的数量。加载数据并打印数组形状需要 180 毫秒。我是通过 os.times()
来获取这个时间的。
如果我想查看某个特定时间帧的数据,我会使用以下代码:
data_1 = data[:, :, 1]
但是,切片操作花费了很多时间(1.76 秒)。我知道我的二维数组很大,但我希望能在某个时候循环处理时间帧,这样在 for
循环中进行切片会非常耗时。
有没有更有效或者更省时间的方法来切片时间帧或者处理这种类型的数据呢?
谢谢!
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/秒。
更合理的推测是,实际上只是构建了一个在文件之上的对象,而切片操作的代价是至少要读取一帧的数据。
如果我们把速度除以75来计算每帧的速度,我们得到1字节像素的速度是68MB/秒,而对于24或32位像素,读取速度可以达到270MB/秒。这就更合理了。