Python - HDF5 到 numpy 数组 - 内存不足

问题描述 投票:0回答:1

我有一个包含 20'000'000 行的 HDF5 文件,每行有 8 个 float32 列。总原始内存大小应约为 640MB。

我想在我的 Python 应用程序中加载这些数据,但是,在加载到 numpy 数组期间,我耗尽了内存(我有 64GB RAM)

我使用这个代码:

import h5py

hf = h5py.File(dataFileName, 'r')
data = hf['data'][:]

对于较小的文件,它可以正常工作,但是,我的输入也没有那么大。那么有没有其他方法可以将整个数据集加载到内存中,因为它应该没有任何问题。 另一方面,为什么需要这么多内存?即使它会在内部将 float32 转换为 float64,它也不会接近整个 RAM 的大小。

python numpy hdf5 h5py
1个回答
0
投票

你是对的。如果您仅将单个 640MB 数据集加载到具有 64 GB RAM 的系统上的单个 NumPy 数组,则不应耗尽内存。如果是的话,问题可能出在其他地方。您是否同时加载大量数组?您的程序中是否还有其他需要大量内存的对象?是否还有其他正在运行的应用程序也消耗大量内存?

首先使用简单的测试用例诊断行为。我编写了一个程序来创建一个包含 1 个数据集的 HDF5 文件,关闭该文件,然后打开并将其读入 1 个数组。它在我的 24 GB RAM 系统上运行,并且应该在您的系统上运行。 (代码在最后。)如果它对您有用,则确认您可以读取此大小的数组,并且问题出在程序的其他地方。如果它不运行,则说明您的系统上的 HDF5/h5py 使用存在更大问题。

注意:您还可以通过创建数据集对象来减少内存使用。这些“行为类似于”NumPy 数组,但内存占用要小得多。这也在代码中得到了证明。

代码如下:

a0, a1 = 20_000_000, 8
arr = np.random.random(a0*a1).reshape(a0*a1).astype(np.float32)
with h5py.File('SO_76906733.h5','w') as h5f:
    h5f.create_dataset('test',data=arr)
    
with h5py.File('SO_76906733.h5','r') as h5f:
    print(h5f['test'].dtype, h5f['test'].shape)
    dset = h5f['test']  ## creates h5py dataset object
    print(f'Dataset memory used: {sys.getsizeof(dset)}')
    data = h5f['test'][()]  ## creates numpy array object
    print(f'Array memory used: {sys.getsizeof(data)}')
© www.soinside.com 2019 - 2024. All rights reserved.