读取大的.h5文件时出现内存错误

时间:2019-11-24 14:47:07

标签: python numpy memory hdf5 h5py

我已经从numpy数组创建了.h5

class Foo
{
    public string Name { get; set; }
    public bool HasName => !String.IsNullOrEmpty(Name);  ////assume you want empty to be treated same way as null
    public void NameToUpperCase()
    {
        if (HasName)
        {
            Name = Name.ToUpper();
        }
    }
}

HDF5数据集“ JZ3WPpxpypz”:形状(19494500,376),键入“ f8”

但是在将.h5文件读取到numpy数组时遇到内存错误

h5f = h5py.File('/data/debo/jetAnomaly/AtlasData/dijets/mergedRoot/miniTrees/JZ3W.h5', 'w')
h5f.create_dataset('JZ3WPpxpypz', data=all, compression="gzip")

[u'JZ3WPpxpypz']

filename = '/data/debo/jetAnomaly/AtlasData/dijets/mergedRoot/miniTrees/JZ3W.h5'
h5 = h5py.File(filename,'r')

h5.keys()

如果我尝试查看数组,则会给我内存错误

data = h5['JZ3WPpxpypz']

是否有任何有效的内存方式将.h5文件读入numpy数组?

谢谢, 德波。

1 个答案:

答案 0 :(得分:0)

您无需调用problem = ProblemSIRD(bjorgvin, alpha, beta, gamma)即可获取数组。 试试这个:

numpy.ndarray()

添加arr = h5['JZ3WPpxpypz'][:] # or arr = data[:] 返回数组(与您的[:]变量不同-它仅引用HDF5数据集)。两种方法都应为您提供与原始数组相同的dtype和形状的数组。您还可以使用numpy切片操作来获取数组的子集。

需要澄清。我忽略了data被作为打印numpy.ndarray()的过程的一部分。 以下是类型检查,以显示两次调用的收益差异:

data[:]

输出将如下所示:

# check type for each variable:
data = h5['JZ3WPpxpypz']
print (type(data))
# versus
arr = data[:]
print (type(arr))

通常,h5py数据集的行为类似于numpy数组(根据设计)。 但是,它们并不相同。当您尝试通过此调用(<class 'h5py._hl.dataset.Dataset'> <class 'numpy.ndarray'> 打印数据集内容时,h5py尝试使用data[:]在后​​台将数据集转换为numpy数组。如果您有一个较小的数据集或足够的内存,它会起作用。

我的要点:调用numpy.ndarray()会创建一个不调用arr = h5['JZ3WPpxpypz'][:]的进程的numpy数组。

当数据集非常大时,您可能会遇到无法使用numpy.ndarray()创建数组的情况,因为数据集太大而无法作为numpy数组放入内存。发生这种情况时,您可以创建h5py数据集对象,然后使用切片符号访问数据的子集,例如以下简单示例:

arr= h5f['dataset'][:]