Numpy 和 PyTables 的浮点异常
Posted
技术标签:
【中文标题】Numpy 和 PyTables 的浮点异常【英文标题】:Floating Point Exception with Numpy and PyTables 【发布时间】:2011-11-28 20:23:52 【问题描述】:我有一个由 PyTables 生成的相当大的 HDF5 文件,我试图在集群上读取它。当我阅读单个块时,我遇到了 NumPy 的问题。我们来看例子:
HDF5文件中数组的总形状是,
In [13]: data.shape
Out[13]: (21933063, 800, 3)
此数组中的每个条目都是一个np.float64
。
我让每个节点读取大小为(21933063,10,3)
的切片。不幸的是,NumPy 似乎无法一次读取所有 2100 万个子切片。我尝试通过将这些切片分成 10 个大小为 (2193306,10,3)
的切片来按顺序执行此操作,然后使用以下 reduce 使事情正常工作:
In [8]: a = reduce(lambda x,y : np.append(x,y,axis=0), [np.array(data[i* \
chunksize: (i+1)*chunksize,:10],dtype=np.float64) for i in xrange(k)])
In [9]:
1 <= k <= 10
和 chunksize = 2193306
。此代码适用于k <= 9
;否则我会得到以下信息:
In [8]: a = reduce(lambda x,y : np.append(x,y,axis=0), [np.array(data[i* \
chunksize: (i+1)*chunksize,:10],dtype=np.float64) for i in xrange(k)])
Floating point exception
home@mybox 00:00:00 ~
$
我尝试使用 Valgrind 的 memcheck
工具来找出发生了什么,似乎 PyTables 是罪魁祸首。跟踪中显示的两个主要文件是libhdf5.so.6
和一个与blosc
相关的文件。
另外,请注意,如果我有 k=8
,我会得到:
In [12]: a.shape
Out[12]: (17546448, 10, 3)
但如果我附加最后一个子切片,我会得到:
In [14]: a = np.append(a,np.array(data[8*chunksize:9*chunksize,:10], \
dtype=np.float64))
In [15]: a.shape
Out[15]: (592192620,)
有人知道该怎么做吗?谢谢!
【问题讨论】:
直接将数据读入numpy数组会出现什么错误?我建议您预先分配目标数组,而不是尝试通过附加多个数组来构建它。 【参考方案1】:您之前是否尝试过分配这么大的数组(如 DaveP 建议的那样)?
In [16]: N.empty((21000000,800,3))
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
...
ValueError: array is too big.
这是在 32 位 Python 上。 您实际上需要 20e6*800*3*8/1e9=384 GB 的内存! 一个 Float64 需要 8 个字节。 你真的需要一次整个数组吗?
抱歉,没有正确阅读帖子。
您的包含 k=8 个子切片的数组已经大约 4.1 GB。也许这就是问题所在?
如果最后一个维度只使用 8 而不是 10 是否有效?
另一个建议,我会先尝试调整数组的大小,然后将其填满:
a = zeros((4,8,3))
a = resize(a, (8,8,3))
a[4:] = ones((4,8,3))
【讨论】:
以上是关于Numpy 和 PyTables 的浮点异常的主要内容,如果未能解决你的问题,请参考以下文章
使用python(numpy memmap,pytables或其他?)对巨大矩阵进行快速下采样
python 转储和加载稀疏矩阵https://stackoverflow.com/questions/11129429/storing-numpy-sparse-matrix-in-hdf5-pyt