Python 读取大型HDF5文件

Python 读取大型HDF5文件,python,python-3.x,hdf5,cnn,hdf5storage,Python,Python 3.x,Hdf5,Cnn,Hdf5storage,我不熟悉使用HDF5文件,我正在尝试读取形状为(206702242243)的文件。每当我试图将hdf5的结果存储到一个列表或另一个数据结构中时,都会花费很长时间,导致我中止执行,或者导致我的计算机崩溃。我需要能够读取3组hdf5文件,使用它们的数据,操作它,使用它来训练CNN模型并做出预测 对于阅读和使用这些大型HDF5文件的任何帮助,我们将不胜感激 目前,我是这样读取hdf5文件的: db = h5py.File(os.getcwd() + "/Results/Training_Da

我不熟悉使用HDF5文件,我正在尝试读取形状为
(206702242243)
的文件。每当我试图将hdf5的结果存储到一个列表或另一个数据结构中时,都会花费很长时间,导致我中止执行,或者导致我的计算机崩溃。我需要能够读取3组hdf5文件,使用它们的数据,操作它,使用它来训练CNN模型并做出预测

对于阅读和使用这些大型HDF5文件的任何帮助,我们将不胜感激

目前,我是这样读取hdf5文件的:

db = h5py.File(os.getcwd() + "/Results/Training_Dataset.hdf5")
training_db = list(db['data'])

崩溃可能意味着内存不足。正如Vignesh Pillay所建议的,我会尝试将数据分块,一次处理一小块数据。如果使用pandas方法,则可以使用迭代器和chunksize参数来控制分块:

将熊猫作为pd导入
data\u iter=pd.read\u hdf('/tmp/test.hdf',key='test\u key',iterator=True,chunksize=100)
对于数据块中的块:
#在这里训练cnn
打印(chunk.shape)

注意:这要求hdf采用表格格式

崩溃可能意味着内存不足。正如Vignesh Pillay所建议的,我会尝试将数据分块,一次处理一小块数据。如果使用pandas方法,则可以使用迭代器和chunksize参数来控制分块:

将熊猫作为pd导入
data\u iter=pd.read\u hdf('/tmp/test.hdf',key='test\u key',iterator=True,chunksize=100)
对于数据块中的块:
#在这里训练cnn
打印(chunk.shape)

注:这要求hdf采用表格格式

我的答案更新2020-08-03,以反映您添加到问题中的代码。 正如@Tober所指出的,您的内存正在耗尽。读取形状数据集(206702242243)将成为3.1G实体的列表。如果读取3个图像集,则需要更多的RAM。 我假设这是图像数据(可能是20670个形状的图像(2242243))? 如果是这样,您可以使用
h5py
(Pytables)读取切片中的数据。 这将以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
)来读取多个图像,然后适当地处理循环。

我的答案更新了2020-08-03,以反映您添加到问题中的代码。 正如@Tober所指出的,您的内存正在耗尽。读取形状数据集(206702242243)将成为3.1G实体的列表。如果读取3个图像集,则需要更多的RAM。 我假设这是图像数据(可能是20670个形状的图像(2242243))? 如果是这样,您可以使用
h5py
(Pytables)读取切片中的数据。 这将以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
)来读取多个图像,然后适当地处理循环。

内存不足时会出现问题。因此,虚拟数据集在处理像您这样的大型数据集时非常方便。虚拟数据集允许通过接口层将多个真实数据集映射到单个可切片数据集。你可以在这里阅读更多关于他们的信息

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

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
数据类型,否则会出现错误。

内存不足时会出现问题。因此,虚拟数据集在处理像您这样的大型数据集时非常方便。虚拟数据集允许通过接口层将多个真实数据集映射到单个可切片数据集。你可以在这里阅读更多关于他们的信息

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

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
数据类型,否则会出错。

您应该尝试分块数据以获得更快的io。您应该尝试分块数据以获得更快的io。我添加了如何读取和使用hdf5文件。我的电脑有8GB的内存,你认为一切都是正确的。这是20670张带有形状的图像(224,3)。我能分批训练CNN模型吗?我更新了答案以反映你的代码。注意:
training\u db
是一个h5py数据集对象,其“行为类似于”NumPy数组。但是,与将数据集内容读入内存(作为列表或数组)相比,它需要的内存要少得多。我不熟悉CNN,所以不知道如何分批训练。我见过其他类似的帖子,所以假设可以做到。坦白地说,当你想处理大数据集时,8GBRAM不是很好。我补充了我如何读取和使用hdf5文件。我的电脑有8GB的内存,你认为一切都是正确的。这是20670张带有形状的图像(224,3)。我能分批训练CNN模型吗?我更新了答案以反映你的代码。注意:
training\u db
是一个h5py数据集对象,其“行为类似于”NumPy数组。但是,与将数据集内容读入内存(作为列表或数组)相比,它需要的内存要少得多。我不熟悉CNN,所以不知道如何分批训练。我见过奥特