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

2024-10-03 17:19:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我用numpy数组创建了一个.h5

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

HDF5数据集“JZ3WPpxpypz”:形状(19494500376),类型“f8”

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

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

h5.keys()

[u'JZ3WPpxpypz']

data = h5['JZ3WPpxpypz']

如果我试图看到数组,它会给我内存错误

data[:]

---------------------------------------------------------------------------
MemoryError                               Traceback (most recent call last)
<ipython-input-33-629f56f97409> in <module>()
----> 1 data[:]

h5py/_objects.pyx in h5py._objects.with_phil.wrapper()

h5py/_objects.pyx in h5py._objects.with_phil.wrapper()

/home/debo/env_autoencoder/local/lib/python2.7/site-packages/h5py/_hl/dataset.pyc in __getitem__(self, args)
    560         single_element = selection.mshape == ()
    561         mshape = (1,) if single_element else selection.mshape
--> 562         arr = numpy.ndarray(mshape, new_dtype, order='C')
    563 
    564         # HDF5 has a bug where if the memory shape has a different rank

MemoryError: 

有没有内存效率高的方法将.h5文件读入numpy数组?你知道吗

谢谢你, 德波。你知道吗


Tags: 内存innumpydataobjects数组fileh5
1条回答
网友
1楼 · 发布于 2024-10-03 17:19:11

您不需要调用numpy.ndarray()来获取数组。 试试这个:

arr = h5['JZ3WPpxpypz'][:]
# or
arr = data[:]

添加[:]返回数组(与data变量不同,它只是引用HDF5数据集)。任何一种方法都应该为您提供一个与原始数组具有相同数据类型和形状的数组。还可以使用numpy切片操作来获取数组的子集。你知道吗

需要澄清一下。我忽略了numpy.ndarray()是作为打印data[:]过程的一部分调用的。 下面是类型检查,以显示这两个调用返回的差异:

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

输出如下所示:

<class 'h5py._hl.dataset.Dataset'>
<class 'numpy.ndarray'>

通常,h5py数据集的行为类似于numpy数组(按设计)。但是,它们并不相同。当您尝试使用此调用(data[:])打印数据集内容时,h5py尝试使用numpy.ndarray()在后台将数据集转换为numpy数组。如果你有一个更小的数据集或足够的内存,它就会工作。你知道吗

我的收获:调用arr = h5['JZ3WPpxpypz'][:]创建numpy数组的进程不调用numpy.ndarray()。你知道吗

当您有非常大的数据集时,可能会遇到无法使用arr= h5f['dataset'][:]创建数组的情况,因为数据集太大,无法作为numpy数组放入内存。当出现这种情况时,您可以创建h5py数据集对象,然后使用切片表示法访问数据的子集,如下面这个简单的示例:

data = h5['JZ3WPpxpypz']
arr1 = data[0:100000]
arr2 = data[100000:200000])
# etc

相关问题 更多 >