为了账号安全,请及时绑定邮箱和手机立即绑定

读取大型 HDF5 文件

读取大型 HDF5 文件

蓝山帝景 2023-04-18 17:34:54
我刚开始使用 HDF5 文件,我正在尝试读取形状为(20670, 224, 224, 3). 每当我尝试将 hdf5 的结果存储到列表或其他数据结构中时,要么花费很长时间以至于我中止执行,要么导致我的计算机崩溃。我需要能够读取 3 组 hdf5 文件,使用它们的数据,对其进行操作,使用它来训练 CNN 模型并进行预测。非常感谢阅读和使用这些大型 HDF5 文件的任何帮助。目前这是我阅读 hdf5 文件的方式:db = h5py.File(os.getcwd() + "/Results/Training_Dataset.hdf5") training_db = list(db['data'])
查看完整描述

3 回答

?
慕姐8265434

TA贡献1813条经验 获得超2个赞

崩溃可能意味着您的内存不足,我会尝试将数据分块并一次处理其中的一小部分。如果您使用的是 pandas 方法read_hdf,则可以使用 iterator 和 chunksize 参数来控制分块:


import pandas as pd

data_iter = pd.read_hdf('/tmp/test.hdf', key='test_key', iterator=True, chunksize=100)

for chunk in data_iter:

   #train cnn on chunk here

   print(chunk.shape)

请注意,这要求 hdf 为表格格式


查看完整回答
反对 回复 2023-04-18
?
慕森卡

TA贡献1806条经验 获得超8个赞

您的内存不足。读取一个shape为(20670, 224, 224, 3)的数据集,会变成一个3.1G实体的列表。如果您读取 3 个图像集,则需要更多的 RAM。我假设这是图像数据(可能是 20670 个形状为 (224, 224, 3) 的图像)?h5py如果是这样,您可以使用和(Pytables)读取切片中的数据tables。这会将数据作为 NumPy 数组返回,您可以直接使用它(无需操作成不同的数据结构)。


基本过程如下所示:


with h5py.File(os.getcwd() + "/Results/Training_Dataset.hdf5",'r') as db:

     training_db = db['data']

     # loop to get images 1 by 1

     for icnt in range(20670) :

         image_arr = training_db [icnt,:,:,:}


     # then do something with the image

您还可以通过将第一个索引设置为一个范围(比如icnt:icnt+100)来读取多个图像,然后适当地处理循环。


查看完整回答
反对 回复 2023-04-18
?
万千封印

TA贡献1891条经验 获得超3个赞

当您的内存不足时,就会出现您的问题。因此,在处理像您这样的大型数据集时,虚拟数据集会派上用场。虚拟数据集允许通过接口层将多个真实数据集映射到一个单一的、可切片的数据集。


我建议您一次从一个文件开始。首先,创建一个现有数据的虚拟数据集文件,例如


with h5py.File(os.getcwd() + "/Results/Training_Dataset.hdf5", 'r') as db:

     data_shape = db['data'].shape

     layout = h5py.VirtualLayout(shape = (data_shape), dtype = np.uint8)

     vsource = h5py.VirtualSource(db['data'])

     with h5py.File(os.getcwd() + "/virtual_training_dataset.hdf5", 'w', libver = 'latest') as file:

         file.create_virtual_dataset('data', layout = layout, fillvalue = 0)

     

这将创建一个现有训练数据的虚拟数据集。现在,如果你想操作你的数据,你应该以r+这样的模式打开你的文件


with h5py.File(os.getcwd() + "/virtual_training_dataset.hdf5", 'r+', libver = 'latest') as file:

    # Do whatever manipulation you want to do here

我想建议的另一件事是确保切片时的索引是int数据类型的,否则会出错。


查看完整回答
反对 回复 2023-04-18
  • 3 回答
  • 0 关注
  • 297 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信