将数据写入大小调整后的hdf5数据集失败的方式令人惊讶

时间:2019-07-18 02:05:07

标签: python hdf5 h5py

我正在尝试创建一个我最初不知道完整大小的数据集。

我创建具有以下属性的数据集。

file['data'].create_dataset(
   name='test', shape=(10, len(arr1)), 
   maxshape=(10, None), dtype=float,
   scaleoffset=3, chunks=True, 
   compression='gzip', compression_opts=4, fillvalue=np.nan)

其中形状的最终尺寸是我需要扩展的尺寸(由第一个输入指定的初始形状)。

当我为arr2调整数据集的大小时,一切工作正常,但是当我尝试将其扩展为arr3的更大尺寸时,事情就会开始表现出异常。

如果我逐步调整大小并依次写每个数组,则数据集的内容将损坏,并且将第一个数组长度(arr1)以外的值(在这种情况下为100)写入填充值(nan),而前100个值已正确存储。请注意,在调整大小和写入arr2时不会发生这种情况,这将正确写入arr2的所有值,同时用nan扩展第一个条目。

我也尝试过手动增加块大小,但是当我写较小的数组时,除非使用了正确的填充值(默认为0,而不是nan),否则将失败,除非块大小显着变大与最大数组相比,最大数组仍会被截断为块大小之外的填充值。

arr1 = np.arange(0, 100, step=1, dtype=float)
arr2 = np.arange(0, 233, step=1, dtype=float)
arr3 = np.arange(0, 50000, step=1, dtype=float)

file = h5py.File(my_data_file, 'w')
file.create_group('data')
file['data'].create_dataset(
   name='test', shape=(10, len(arr1)), 
   maxshape=(10, None), dtype=float,
   scaleoffset=3, chunks=True, 
   compression='gzip', compression_opts=4, fillvalue=np.nan)

file['data']['test'][0, :len(arr1)] = arr1
try:
    file['data']['test'][1, :len(arr2)] = arr2
except TypeError as e:
    print('New data too large for old dataset, resizing')
    file['data']['test'].resize((10, len(arr2)))
    file['data']['test'][1, :len(arr2)] = arr2

如果我在这里停止,一切都会按预期进行,但是主要的问题出现在我运行以下代码时。

try:
    file['data']['test'][2, :len(arr3)] = arr3
except TypeError as e:
    print('New data too large for old dataset, resizing')
    file['data']['test'].resize((10, len(arr3)))
    file['data']['test'][2, :len(arr3)] = arr3

1 个答案:

答案 0 :(得分:0)

我进行了一些测试以进行诊断。首先,我执行了3个单独的步骤,发现行为与您描述的不同。
测试1:仅arr1
仅将arr1添加到第0行并关闭文件:
第0行具有正确的arr1值,第1-9行由0.0而非NaN填充。
测试2:arr1和arr2
在第0行中添加arr1,调整大小,然后在第1行中添加arr2,然后关闭文件:
对于第0-99列:填充第0行和第1行,并填充第2行至第9行,而不是NaN。 100+列都是=NaN,代表所有行。请注意,文件中没有arr2值>99。
测试3:arr1,arr2,arr3
按照上述过程加载所有3个数组:
与测试2相似的结果:对于第0-99列:第0,1,2行填充,第3-9行填充0.0,而不是NaN。 100+列都是=NaN,代表所有行。请注意,文件中没有arr2arr3值> 99。

然后我在修改create_dataset()后重新运行测试3 ;删除以下参数:scaleoffset=3, chunks=True, compression='gzip', compression_opts=4。 生成的HDF5文件看起来与预期的完全一样,在没有添加数据的所有地方(行0,列100+,行1,列233+,以及行3-9中的所有列)中,NaN都与预期的一样。请参阅下面的修改后的通话:

h5f['data'].create_dataset(
   name='test', shape=(10, len(arr1)), 
   maxshape=(10, None), dtype=float, fillvalue=np.nan) 

我对这4个删除的参数了解得不够多,无法解释为什么它起作用-只有它能起作用。