将切片写入使用h5py的现有hdf5数据的速度非常慢

时间:2017-07-20 10:08:10

标签: python python-2.7 h5py

我有一个(22500,516,516),uint16 h5py数据集,我想在处理数据后逐个替换。

为此,我按以下方式加载了几个数据块(块形状为(1,129,129)):

chunk = data[:,
         i1*129:(i1+1)*129,
         i2*129:(i2+1)*129].astype(pl.float32)

其中data是数据集和i1, i2索引,它们都在新闻循环中从0到3运行。

稍后在循环中我写了处理过的数据:

data[:,
     i1*129:(i1+1)*129,
     i2*129:(i2+1)*129] = chunk.astype(pl.uint16)

在这里,我经历了很长的延迟,该过程将变为不间断(状态D)并导致0%的CPU负载。内存使用率约为1%。 此外,与此PC或具有相同驱动器的服务器的不同ssh会话几乎没有响应。它似乎冻结了一段时间。

但是,如果我在循环之前创建一个新数据集

datanew = entry.create_dataset("data_new",
                             shape=data.shape,
                             chunks=data.chunks,
                             dtype=data.dtype,
                             compression="gzip",
                             compression_opts=4)

并写信给这个数据集,我没有遇到任何问题,而且表现也相当不错。

新数据集的唯一区别在于原始数据集使用lzf压缩。

有什么办法可以理解这里的错误吗?

由于

1 个答案:

答案 0 :(得分:2)

您的HDF5文件(本地ssd /硬盘或NAS)在哪个存储设备上?

可能由于文件碎片而遇到问题。 Chunks是按顺序读写的。

如果覆盖压缩块较大的压缩块(使用压缩数据集时可能会发生这种情况),则块可能会在磁盘上碎片化。性能影响取决于存储设备的延迟(NAS>>本地硬盘>> SSD)。

如果你看到这种效果我会推荐以下内容:

在访问具有高延迟的存储设备上的文件时,您可能还希望增加块大小以获得更好的性能。如果仅以上面显示的方式访问数据集,则可以将块大小增加到(50,129,129)甚至更多。 关于不同存储设备上的chunksize的一些简单的工作人员: https://stackoverflow.com/a/44961222/4045774