Numpy和PyTables中的浮点异常

14 投票
1 回答
2156 浏览
提问于 2025-04-17 03:27

我有一个比较大的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))

撰写回答