2009-03-06 11 views
7

私が正常に行うことができます。メモリ消費を減らすために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作業を行うようにしています。

答えて

5

scipyのfft関数でこれを行う関数がないように見えます(http://www.astro.rug.nl/efidad/scipy.fftpack.basic.html参照)。

Python用の固定小数点FFTライブラリが見つからない限り、ネイティブハードウェア浮動小数点フォーマットは128ビットなので、必要な機能は存在しない可能性があります。これは、rfftメソッドを使用してFFTの実数成分(フェーズなし)を得ることができ、RAMの半分を節約できるように見えます。 pythonのRSS(常駐セットサイズ)は265メガバイトだったこの時点で

>>> from numpy import * 
>>> v = array(10000*random.random([512,512,512]),dtype=int16) 
>>> shape(v) 
(512, 512, 512) 
>>> type(v[0,0,0]) 
<type 'numpy.int16'> 

は、私は対話のpythonに次のように走りました。

f = fft.fft(v) 

そしてこの時点では、Python 2.3GBのRSSです。

>>> type(f) 
<type 'numpy.ndarray'> 
>>> type(f[0,0,0]) 
<type 'numpy.complex128'> 
>>> v = [] 

そして、私はVをアップfree'dてきたので、RSSは、ダウン2.0ギガバイトに行くこの時点で

「fft.rfft(V)」のみになり、実際の値を計算するために使用1.3GBのRSS。 (ほぼ半分、期待通りに)

はこう:それは最初complex128バージョン(2.3ギガバイト)を計算し、その後complex64バージョン(1.3ギガバイト)にコピーするので

>>> f = complex64(fft.fft(v)) 

は、両方の世界の最悪ですこれは私のマシン上のピークRSSが3.6GBだったことを意味し、再び1.3GBに落ち着いた。

私はあなたが4GBのRAMを持っていれば、これはすべてうまくいくはずだと思います。問題は何ですか?

+1

rfftn関数へのポインタをありがとう。はい、それらはうまく仕事を行います。 f = rfftn(v)、f = array(f、dtype = np.complex64)、f = irfftn(f)のピーク使用量は、逆数で6224MByteです。 (中間のキャストがcomplex64になければ、それは7754MByte ...少しタイト)。 – timday

+0

生産アレイサイズが実際に512^3よりも大きいですか?上記の例のコードで見ているように、なぜRAM使用量が4倍のようなものを見ているのか分かりません。 – slacy

+0

ネイティブハードウェアが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 –

4

Scipy 0.8はほぼすべてのfftコードに対して単精度のサポートを持っています(コードはすでにトランクに入っていますので、機能が必要な場合はsvnからscipyをインストールできます)。

関連する問題