私が正常に行うことができます。メモリ消費を減らすためにscipy/numpyの精度を下げる方法はありますか?私の64ビットのDebian /レニーシステム(4GバイトRAM + 4Gバイトのスワップパーティション)に
v=array(10000*random([512,512,512]),dtype=np.int16)
f=fftn(v)
が、fはnp.complex128
メモリ消費が衝撃的である、と私は多くを行うことはできませんことをMemoryError
トレースバックなしで結果をより多く(例えば、係数を変調してからf=ifftn(f)
)にします。
RAMを増設したり、スワップパーティションを拡張したりするのではなく、scipy/numpyの「デフォルト精度」を制御して代わりにcomplex64配列を計算する方法がありますか?
f=array(f,dtype=np.complex64)
で後で減らすことができます。私はそれが実際に32ビットの精度と半分のメモリでFFT作業を行うようにしています。
rfftn関数へのポインタをありがとう。はい、それらはうまく仕事を行います。 f = rfftn(v)、f = array(f、dtype = np.complex64)、f = irfftn(f)のピーク使用量は、逆数で6224MByteです。 (中間のキャストがcomplex64になければ、それは7754MByte ...少しタイト)。 – timday
生産アレイサイズが実際に512^3よりも大きいですか?上記の例のコードで見ているように、なぜRAM使用量が4倍のようなものを見ているのか分かりません。 – slacy
ネイティブハードウェアが128ビットであるため、「単精度が存在しない」と言うビットを修正してください。ネイティブハードウェアは64ビットよりも128ビットではなく、FFTWは両方をサポートするのに非常に柔軟です。 Davidの答えが示すように、 'scipy.fftpack.rfft'はこれをサポートします:' scipy.fftpack.rfft(v.astype(np.float32)).dtype'は 'float32'を返します。残念ながら、Numpyのサポートは、2015年であっても、Scipyのサポートに遅れています。https://github.com/numpy/numpy/issues/6012 –