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

File io 如何使用h5py创建具有早期分配和无填充的hdf5数据集,file-io,io,hdf5,hpc,h5py,File Io,Io,Hdf5,Hpc,H5py,我试图通过以2d块分区方式填充数据集来创建一个78TB HDF5数据集。当我正在写入的块跨越从未写入的行时,这是非常缓慢的,因为HDF5正在进入并分配磁盘空间,并用零填充缺少的条目 相反,我希望在数据集创建后立即为其分配磁盘空间,而不要填充它。根据中的表16,使用C api可以做到这一点,但如何使用h5py做到这一点,最好是使用高级接口?尝试指定与写入模式匹配的块形状。例如,如果您以1024x1024块为单位进行写入,则如下所示: import h5py import numpy as np f

我试图通过以2d块分区方式填充数据集来创建一个78TB HDF5数据集。当我正在写入的块跨越从未写入的行时,这是非常缓慢的,因为HDF5正在进入并分配磁盘空间,并用零填充缺少的条目


相反,我希望在数据集创建后立即为其分配磁盘空间,而不要填充它。根据中的表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。

尝试指定与写入模式匹配的块形状。例如,如果您以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()例程将填充时间设置为“从不”,但我不知道用h5py的方法来做这件事。

我相信你想用H5Pset_fill_time()例程将填充时间设置为“从不”,但我不知道怎么做。

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

#使用低级api创建行数据集,这样我可以强制它不进行零填充,然后转换为高级对象
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,“行”,h5py.h5t.NATIVE_-DOUBLE,spaceid,plist)
rows=h5py.Dataset(datasetid)

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

#使用低级api创建行数据集,这样我可以强制它不进行零填充,然后转换为高级对象
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,“行”,h5py.h5t.NATIVE_-DOUBLE,spaceid,plist)
rows=h5py.Dataset(datasetid)

我忘记了创建文件的那一行,这将在create_数据集调用之前:f=h5py.file('mybigdset.h5','w'),谢谢你的建议。我生成这个文件是为了在一个应用程序中使用,在这个应用程序中,访问将以行块的形式进行,所以我不想使用分块。我不确定我是否遵循。。。使用分块的缺点是什么?我一次能写的块又高又瘦,所以用它们作为分块阅读行是没有效率的。但是我认为如果我合理地设置块大小,我将能够以合理的粒度读取行。例如,我的输出矩阵是132710400×81600,每个进程一次可以写入26542080×8的数据块,因此如果我集体写入大小为1024×480(3.75MB)的数据块,当我读入时,我将有129600×170的数据块,因此在行读取过程中具有较高的粒度。当我看到这是如何工作的时候,我会告诉你:)我忘记了创建文件的那一行,这将在create_数据集调用之前:f=h5py.file('mybigdset.h5','w'),谢谢你的建议。我生成这个文件是为了在一个应用程序中使用,在这个应用程序中,访问将以行块的形式进行,所以我不想使用分块。我不确定我是否遵循。。。使用分块的缺点是什么?我一次能写的块又高又瘦,所以用它们作为分块阅读行是没有效率的。但是我认为如果我合理地设置块大小,我将能够以合理的粒度读取行。例如,我的输出矩阵是132710400×81600,每个进程一次可以写入26542080×8的数据块,因此如果我集体写入大小为1024×480(3.75MB)的数据块,当我读入时,我将有129600×170的数据块,因此在行读取过程中具有较高的粒度。当我看到这是如何工作的时,我将向您提供最新信息:)