14

クラスターで読み取ろうとしている PyTables によって生成されたかなり大きな HDF5 ファイルがあります。個々のチャンクを読み込んでいるときに、NumPy で問題が発生しています。例を見てみましょう:

HDF5 ファイル内の配列の全体形状は、

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

この配列の各エントリはnp.float64.

各ノードに size のスライスを読み取らせています(21933063,10,3)。残念ながら、NumPy は 2100 万のサブスライスを一度にすべて読み取ることができないようです。これらのスライスを 10 個のスライスに分割し(2193306,10,3)、次の reduce を使用して動作させることで、これを順番に実行しようとしました。

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
home@mybox  00:00:00  ~
$

Valgrind のmemcheckツールを使用して何が起こっているのかを調べてみましたが、PyTables が原因のようです。トレースに表示される 2 つの主なファイルは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,)

何をすべきか考えている人はいますか?ありがとう!

4

1 に答える 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 GB のメモリが必要です! 1 つの Float64 には 8 バイトが必要です。一度に配列全体が本当に必要ですか?

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

k=8 サブスライスを持つ配列は、すでに約 4.1 GByte の大きさです。たぶんそれが問題ですか?

最後の次元に10ではなく8だけを使用しても機能しますか?

別の提案として、最初に配列のサイズを変更してから、いっぱいにしてみます。

a = zeros((4,8,3))
a = resize(a, (8,8,3))
a[4:] = ones((4,8,3))
于 2011-10-13T11:08:24.460 に答える