2011-09-30 9 views
14

私はクラスタで読み込もうとしているPyTablesによって生成されたむしろ大きなHDF5ファイルを持っています。私はNumPyの問題に遭遇しています。私は個々のチャンクで読みました。 HDF5ファイル内の内の配列の合計形状があるNumpyとPyTablesを使用した浮動小数点例外

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

この配列の各エントリはnp.float64です:のは、一例で行こう。

各ノードには、サイズが(21933063,10,3)の読み取りスライスがあります。残念ながら、NumPyは一度に2,100万のすべてのサブスライスを読むことができないようです。

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を:私はサイズ(2193306,10,3)の10枚のスライスにこれらのスライスを分割して、物事が作業を取得するために減らす、次を使用して、この順に行うことを試みました。このコードは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が犯人であるかのように思えます。トレースに表示される2つのメインファイルは、libhdf5.so.6と、bloscに関連するファイルです。また

、私はk=8を持っている場合は、私が得ることに注意してください:

In [12]: a.shape 
Out[12]: (17546448, 10, 3) 

しかし、私は最後のsubsliceを追加した場合、私が手:

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 = 384GBのメモリが必要です。 1つのFloat64には8バイトが必要です。 本当に一度にアレイ全体が必要ですか?

申し訳ありませんが、正しく投稿を読んでいません。

k = 8サブスライスの配列は、すでに約4.1ギガバイトです。多分それは問題ですか?

の代わりにの最後のディメンションを使用すると機能しますか?

もう一つの提案、私は配列のサイズを変更するにはまずしようとするだろうし、それを埋める:

a = zeros((4,8,3)) 
a = resize(a, (8,8,3)) 
a[4:] = ones((4,8,3)) 
関連する問題