Domanda

Sul mio sistema Debian / Lenny a 64 bit (4GByte RAM + 4GByte swap partition) posso fare con successo:

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

ma essendo f un np.complex128 il consumo di memoria è scioccante, e non posso fare molto di più con il risultato (es. modulare i coefficienti e quindi f = ifftn (f ) ) senza un traceback MemoryError .

Invece di installare un po 'più di RAM e / o espandere le mie partizioni di swap, esiste un modo per controllare la precisione predefinita di scipy / numpy " e hai invece calcolato un array complex64?

So di poterlo ridurre in seguito con f = array (f, dtype = np.complex64) ; Sto cercando di fare effettivamente il lavoro FFT con precisione a 32 bit e metà della memoria.

È stato utile?

Soluzione

Non sembra che ci sia alcuna funzione per farlo nelle funzioni fft di scipy (vedi http://www.astro.rug.nl/efidad/scipy.fftpack.basic.html ).

A meno che tu non sia in grado di trovare una libreria FFT a punto fisso per Python, è improbabile che la funzione desiderata esista, poiché il tuo formato a virgola mobile hardware nativo è di 128 bit. Sembra che potresti usare il metodo rfft per ottenere solo i componenti a valore reale (nessuna fase) di FFT, e ciò risparmierebbe metà della RAM.

Ho eseguito quanto segue in Python interattivo:

>>> 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'>

A questo punto l'RSS (Resident Set Size) di Python era di 265 MB.

f = fft.fft(v)

E a questo punto l'RSS di Python 2.3GB.

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

E a questo punto l'RSS scende a 2,0 GB, da quando ho liberato v.

Uso di " fft.rfft (v) " per calcolare i valori reali si ottiene solo un RSS da 1,3 GB. (quasi la metà, come previsto)

Fare:

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

È il peggiore dei due mondi, dal momento che prima calcola la versione complex128 (2.3GB) e poi la copia nella versione complex64 (1.3GB), il che significa che l'RSS di picco sulla mia macchina era 3,6GB, e poi si è stabilizzato di nuovo a 1,3 GB.

Penso che se hai 4 GB di RAM, tutto dovrebbe funzionare bene (come per me). Qual è il problema?

Altri suggerimenti

Scipy 0.8 avrà un unico supporto di precisione per quasi tutto il codice fft (il codice è già nel trunk, quindi puoi installare scipy da svn se hai bisogno della funzione ora).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top