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 <= 10chunksize = 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或其他?)对巨大矩阵进行快速下采样

处理大型 Numpy 数组的技术? [复制]

python 转储和加载稀疏矩阵https://stackoverflow.com/questions/11129429/storing-numpy-sparse-matrix-in-hdf5-pyt

使用浮点 NumPy 数组进行比较和相关操作

字符串列表/数组到 numpy 浮点数组

评估 numpy.radians 和浮点/数组输入元素的类型提示