クラスターで読み取ろうとしている 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 <= 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 が原因のようです。トレースに表示される 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,)
何をすべきか考えている人はいますか?ありがとう!