Gibt es eine Möglichkeit, Scipy/Numpy -Präzision zu reduzieren, um den Speicherverbrauch zu verringern?

StackOverflow https://stackoverflow.com/questions/620428

Frage

Auf meinem 64-Bit-Debian/Lenny-System (4GByte Ram + 4GByte-Tauschpartition) kann ich erfolgreich:

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

aber mit f ist a np.complex128 Der Speicherverbrauch ist schockierend und ich kann das Ergebnis nicht viel mehr tun (z. B. modulieren die Koeffizienten und dann die Koeffizienten f=ifftn(f) ) ohne ein MemoryError zurück verfolgen.

Anstatt mehr RAM zu installieren und/oder meine Swap -Partitionen zu erweitern, gibt es eine Möglichkeit, die "Standardpräzision" von Scipy/Numph zu kontrollieren und stattdessen ein Komplex64 -Array zu berechnen?

Ich weiß, dass ich es danach einfach reduzieren kann f=array(f,dtype=np.complex64); Ich möchte, dass es die FFT-Arbeit in 32-Bit-Präzision und der Hälfte des Gedächtnisses erledigt.

War es hilfreich?

Lösung

Es sieht nicht so aus, als ob es eine Funktion gibt, dies in den FFT -Funktionen von Scipy zu tun (siehe http://www.astro.rug.nl/efidad/scipy.fftpack.basic.html ).

Wenn Sie nicht in der Lage sind, eine FFT -FFT -Bibliothek für Python zu finden, ist es unwahrscheinlich, dass die gewünschte Funktion vorhanden ist, da Ihr natives Hardware -Gleitpunktformat 128 Bit beträgt. Es sieht so aus, als ob Sie die RFFT-Methode verwenden könnten, um nur die realen Komponenten (keine Phase) der FFT zu erhalten, und das würde die Hälfte Ihres RAM sparen.

Ich habe Folgendes in interaktiver Python geführt:

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

Zu diesem Zeitpunkt betrug die RSS (Resident Set -Größe) von Python 265 MB.

f = fft.fft(v)

Und an diesem Punkt die RSS von Python 2,3 GB.

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

Und zu diesem Zeitpunkt senkt sich der RSS auf 2,0 GB, da ich frei von V.

Die Verwendung von "fft.rfft (v)" zum Berechnen von Realwerten führt nur zu einem 1,3 GB RSS. (fast die Hälfte, wie erwartet)

Tun:

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

Ist das Schlimmste in beiden Welten, da sie zuerst die Komplex128 -Version (2,3 GB) berechnet und diese dann in die Komplex64 -Version (1,3 GB) kopiert, was bedeutet wieder.

Ich denke, wenn Sie 4 GB RAM haben, sollte dies alles gut funktionieren (wie es für mich der Fall ist). Was ist das Problem?

Andere Tipps

Scipy 0.8 wird für fast den gesamten FFT -Code eine einzelne Präzisionsunterstützung erhalten (der Code befindet sich bereits im Kofferraum, sodass Sie Scipy von SVN von SVN installieren können, wenn Sie die Funktion jetzt benötigen).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top