Numpy和PyTables中的浮点异常
我有一个比较大的HDF5文件,是用PyTables生成的,我正在尝试在一个集群上读取它。读取单个数据块时,我遇到了NumPy的问题。我们来看一个例子:
这个HDF5文件中数组的总形状是:
In [13]: data.shape
Out[13]: (21933063, 800, 3)
这个数组中的每个条目都是一个 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]:
其中 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,)
有没有人有什么建议该怎么做?谢谢!
1 个回答
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 GBytes!一个Float64类型的数据需要8个字节。你真的需要一次性加载整个数组吗?
抱歉,我没有仔细看帖子。
你这个k=8的子数组已经大约有4.1 GByte了。也许这就是问题所在?
如果你把最后一个维度改成8而不是10,这样能行吗?
还有一个建议,我会先尝试调整数组的大小,然后再填充数据:
a = zeros((4,8,3))
a = resize(a, (8,8,3))
a[4:] = ones((4,8,3))