如何使用 h5py 创建具有早期分配且无填充的 hdf5 数据集

how to create hdf5 dataset with early allocate and no fill using h5py

我正在尝试通过以二维块分区方式填充它来创建 78TB HDF5 数据集。当我正在写入的块跨越从未被写入的行时,这非常慢,因为 HDF5 正在进入并分配磁盘space 并用零填充缺失的条目。

相反,我希望 h5py 在我的数据集创建后立即为它分配磁盘 space,并且从不填充它。根据 the HDF5 Dataset documentation 中的 Table 16,使用 C api 是可能的,但是我如何使用 h5py 执行此操作,最好使用高级接口?

尝试指定与您的写入模式匹配的块形状。例如,如果您以 1024x1024 的块书写,它看起来像这样:

import h5py
import numpy as np
f = h5py.File('mybigdset.h5', 'w')
dset = f.create_dataset('dset', (78*1024*1024, 1024*1024), dtype='f4', chunks=(1024,1024))
arr = np.random.rand(1024,1024)
dset[0:1024, 0:1024] = arr
f.close()

谢天谢地,这并没有使用 78TB 的磁盘,文件大小只有 4MB。

我相信您想使用 H5Pset_fill_time() 例程将填充时间设置为 "never",但我不知道 h5py 的方法。

正如昆西建议的那样。您可以使用低级 H5py API 创建具有 FILL_TIME_NEVER 属性 的数据集,然后将其转换回高级数据集对象:

# create the rows dataset using the low-level api so I can force it to not do zero-filling, then convert to a high level object
spaceid = h5py.h5s.create_simple((numRows, numCols))
plist = h5py.h5p.create(h5py.h5p.DATASET_CREATE)
plist.set_fill_time(h5py.h5d.FILL_TIME_NEVER)
plist.set_chunk((rowchunk, colchunk))
datasetid = h5py.h5d.create(fout.id, "rows", h5py.h5t.NATIVE_DOUBLE, spaceid, plist)
rows = h5py.Dataset(datasetid)