【问题标题】:h5py file subset taking more space than parent file?h5py 文件子集比父文件占用更多空间?
【发布时间】:2022-02-13 00:14:00
【问题描述】:

我下载了一个现有的h5py 文件,大小约为 18G。它有许多嵌套的数据集:

h5f = h5py.File('input.h5', 'r') 
data = h5f['data']
latlong_data = data['lat_long'].value

我希望能够对latlong 中的数值数据进行一些基本的最小/最大缩放,因此我想将其放入自己的 h5py 文件中,以便于使用并降低内存使用率。

但是,当我尝试将其写入自己的文件时:

out = h5py.File('latlong_only.h5', 'w')
out.create_dataset('latlong', data=latlong)
out.close() 

输出文件难以置信大。它仍未完成写入磁盘,空间约为 85GB。为什么写入新文件的数据没有被压缩?

【问题讨论】:

    标签: python hdf5 h5py


    【解决方案1】:

    可能是h5f['data/lat_long'] 正在使用压缩过滤器(而您没有)。要检查原始数据集的压缩设置,请使用以下行:

    print (h5f['data/latlong'].compression, h5f['data/latlong'].compression_opts)
    

    写完我的答案后,我突然想到您不需要将数据复制到另一个文件以减少内存占用。您的代码将数据集读入一个数组,这在大多数用例中是不必要的。 h5py 数据集对象的行为类似于 NumPy 数组。相反,使用这一行:ds = h5f1['data/latlong'] 创建一个数据集对象(而不是一个数组)并使用它“就像”它是一个 NumPy 数组。仅供参考,.value 是一种将数据集作为数组返回的已弃用方式。请改用此语法arr = h5f1['data/latlong'][()]。将数据集加载到数组中还需要比使用 h5py 对象更多的内存(这可能是大型数据集的问题)。

    还有其他方法可以访问数据。我对使用数据集对象的建议是一种方式。您的方法(将数据提取到新文件)是另一种方法。我没有找到这种方法,因为您现在拥有 2 个数据副本;簿记的噩梦。另一种选择是创建从新文件到现有 18GB 文件的外部链接。这样你就有了一个链接到大文件的小文件(并且没有重复的数据)。我在这篇文章中描述了该方法:[How can I combine multiple .h5 file?][1] 方法 1:创建外部链接。

    如果您仍想复制数据,我会这样做。您的代码将数据集读入一个数组,然后将该数组写入新文件(未压缩)。相反,使用 h5py 的组 .copy() 方法复制数据集,它将保留压缩设置和属性。 见下文:

    with h5py.File('input.h5', 'r') as h5f1, \
         h5py.File('latlong_only.h5', 'w') as h5f2:
    
        h5f1.copy(h5f1['data/latlong'], h5f2,'latlong')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-29
      • 1970-01-01
      • 2015-10-07
      • 2023-03-17
      • 2017-11-02
      • 2013-05-14
      • 2011-09-07
      • 1970-01-01
      相关资源
      最近更新 更多