2011-09-30 56 views
14

我有一个相当大的HDF5文件生成的PyTables,我试图读取群集。当我在单独的块中读取时,我遇到了NumPy的问题。让我们一起去的例子:Numpy和PyTables浮点异常

数组内的HDF5文件是总的形状,

In [13]: data.shape 
Out[13]: (21933063, 800, 3) 

这个阵列中的每个条目是np.float64

我让每个节点读取大小为(21933063,10,3)的片。不幸的是,NumPy似乎无法一次读取所有2,100万个子映射。我试图做到这一点依次瓜分这些切片放入大小(2193306,10,3)的10片,然后用下面的减少把事情的工作:

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 
[email protected] 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,) 

有谁有什么做的任何想法?谢谢!

+0

什么是你直接将数据读入一个numpy的数组时出现错误?我建议你预先分配目标数组,而不是试图通过追加多个数组来构建它。 – DaveP

回答

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的内存! One Float64需要8个字节。 你是否真的需要整个阵列?

对不起,没有正确阅读文章。

您的k = 8的子阵列阵列已经大约4.1 GByte。也许这是问题?

如果只使用而不是是否适用于最后一维?

另一个建议,我会尝试先调整阵列,然后填写起来:

a = zeros((4,8,3)) 
a = resize(a, (8,8,3)) 
a[4:] = ones((4,8,3))