首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >读取大型.h5文件时内存错误

读取大型.h5文件时内存错误
EN

Stack Overflow用户
提问于 2019-11-24 14:47:07
回答 1查看 1.1K关注 0票数 1

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

代码语言:javascript
复制
h5f = h5py.File('/data/debo/jetAnomaly/AtlasData/dijets/mergedRoot/miniTrees/JZ3W.h5', 'w')
h5f.create_dataset('JZ3WPpxpypz', data=all, compression="gzip")

HDF5数据集"JZ3WPpxpypz":shape (19494500,376),键入"f8“

但是,当我将.h5文件读取到numpy数组时,我得到了一个内存错误。

代码语言:javascript
复制
filename = '/data/debo/jetAnomaly/AtlasData/dijets/mergedRoot/miniTrees/JZ3W.h5'
h5 = h5py.File(filename,'r')

h5.keys()

u'JZ3WPpxpypz‘

代码语言:javascript
复制
data = h5['JZ3WPpxpypz']

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

代码语言:javascript
复制
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数组中?

谢谢,德博。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-24 16:56:23

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

代码语言:javascript
复制
arr = h5['JZ3WPpxpypz'][()]
# or
arr = data[()]

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

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

代码语言:javascript
复制
# check type for each variable:
data = h5['JZ3WPpxpypz']
print (type(data))
# versus
arr = data[()]
print (type(arr))

输出将如下所示:

代码语言:javascript
复制
<class 'h5py._hl.dataset.Dataset'>
<class 'numpy.ndarray'>

通常,h5py数据集行为与numpy数组类似(按设计)。然而,它们是不一样的。当您尝试使用此调用(data[()])打印数据集内容时,h5py试图使用numpy.ndarray()将数据集转换为背景中的numpy数组。如果您有更小的数据集或足够的内存,它就能工作。

我的理解是:调用arr = h5['JZ3WPpxpypz'][()]创建不调用numpy.ndarray()的进程的numpy数组。

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

代码语言:javascript
复制
data = h5['JZ3WPpxpypz']
arr1 = data[0:100000]
arr2 = data[100000:200000])
# etc
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59018887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档