Numpy和PyTables的浮点异常

Tar*_*tra 14 python numpy hdf5 pytables

我有一个由PyTables生成的相当大的HDF5文件,我试图在集群上读取.当我读到一个单独的块时,我遇到了NumPy的问题.我们来看看这个例子:

HDF5文件中阵列的总形状是,

In [13]: data.shape
Out[13]: (21933063, 800, 3)
Run Code Online (Sandbox Code Playgroud)

此数组中的每个条目都是a np.float64.

我让每个节点读取大小的切片(21933063,10,3).不幸的是,NumPy似乎无法一次读取所有2100万个子对象.我试图通过将这些切片分成10个大小的切片(2193306,10,3)然后使用以下简化来使事情正常工作:

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]:
Run Code Online (Sandbox Code Playgroud)

在哪里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  ~
$
Run Code Online (Sandbox Code Playgroud)

我尝试使用Valgrind的memcheck工具来弄清楚发生了什么,似乎PyTables就是罪魁祸首.跟踪中显示的两个主要文件是libhdf5.so.6与之相关的文件blosc.

另外,请注意,如果有k=8,我得到:

In [12]: a.shape
Out[12]: (17546448, 10, 3)
Run Code Online (Sandbox Code Playgroud)

但如果我追加最后一个子集,我得到:

In [14]: a = np.append(a,np.array(data[8*chunksize:9*chunksize,:10],   \
         dtype=np.float64))
In [15]: a.shape
Out[15]: (592192620,)
Run Code Online (Sandbox Code Playgroud)

有没有人有任何想法?谢谢!

mro*_*ssi 1

您之前是否尝试过分配这么大的数组(就像 DaveP 所建议的那样)?

In [16]: N.empty((21000000,800,3))
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
...
ValueError: array is too big.
Run Code Online (Sandbox Code Playgroud)

这是在 32 位 Python 上。您实际上需要 20e6*800*3*8/1e9=384 GB 内存!1 个 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))
Run Code Online (Sandbox Code Playgroud)