8

私の 64 ビット Debian/Lenny システム (4GByte RAM + 4GByte スワップ パーティション) では、次のことが正常に実行できます。

v=array(10000*random([512,512,512]),dtype=np.int16)
f=fftn(v)

しかし、f が aの場合、メモリ消費は衝撃的であり、トレースバックなしでnp.complex128は、結果に対してこれ以上のことはできません (たとえば、係数を変調してから)。f=ifftn(f)MemoryError

RAMを追加したり、スワップパーティションを拡張したりするのではなく、scipy/numpyの「デフォルト精度」を制御し、代わりにcomplex64配列を計算させる方法はありますか?

私は後でそれを減らすことができることを知っていf=array(f,dtype=np.complex64)ます; 私は実際に 32 ビットの精度と半分のメモリで FFT 作業を行うようにしています。

4

2 に答える 2

5

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

Python 用の固定小数点 FFT ライブラリを見つけることができない限り、ネイティブのハードウェア浮動小数点形式が 128 ビットであるため、必要な関数が存在する可能性はほとんどありません。rfft メソッドを使用して、FFT の実数値コンポーネント (位相なし) のみを取得できるように見えます。これにより、RAM の半分を節約できます。

インタラクティブなpythonで次を実行しました:

>>> 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 の RSS (Resident Set Size) は 265MB でした。

f = fft.fft(v)

そしてこの時点でpython 2.3GBのRSS。

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

この時点で、RSS は 2.0GB まで減少します。

「fft.rfft(v)」を使用して実数値のみを計算すると、1.3GB RSS になります。(予想通り、ほぼ半分)

やっている:

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

最初にcomplex128バージョン(2.3GB)を計算し、それをcomplex64バージョン(1.3GB)にコピーするため、両方の世界で最悪です。これは、マシンのピークRSSが3.6GBであり、その後1.3GBに落ち着いたことを意味しますまた。

4GB の RAM があれば、これで問題なく動作すると思います (私の場合と同様)。問題は何ですか?

于 2009-03-06T21:54:55.333 に答える
4

Scipy 0.8 では、ほぼすべての fft コードで単精度がサポートされます (コードは既にトランクにあるため、今すぐ機能が必要な場合は svn から scipy をインストールできます)。

于 2009-03-21T02:38:55.250 に答える