Auf meinem 64-Bit Debian/Lenny-System (4 GByte RAM + 4 GByte Swap-Partition) I erfolgreich tun können:Gibt es eine Möglichkeit, die Genauigkeit zu reduzieren, um den Speicherverbrauch zu reduzieren?
v=array(10000*random([512,512,512]),dtype=np.int16)
f=fftn(v)
aber mit f ist ein np.complex128
der Speicherverbrauch ist schockierend, und ich kann nicht viel tun, mehr mit dem Ergebnis (zB modulieren die Koeffizienten und dann f=ifftn(f)
) ohne eine MemoryError
Traceback.
Anstatt einige mehr RAM zu installieren und/oder meine Swap-Partitionen zu erweitern, gibt es eine Möglichkeit, die scipy/numpy "Standard-Präzision" zu steuern und stattdessen ein complex64-Array zu berechnen?
Ich weiß, ich kann es nur später mit f=array(f,dtype=np.complex64)
reduzieren; Ich möchte die FFT tatsächlich mit 32-Bit-Präzision und halber Speicherkapazität arbeiten lassen.
Danke für den Zeiger auf die Funktionen rfftn; Ja, die machen das gut. Peak-Nutzung für f = rfftn (v), f = Array (f, dtype = np.complex64), f = irfftn (f) ist 6224MByte in der inversen. (Ohne das intermediate Cast zu complex64 verwendet es 7754MByte ... ein bisschen knapp). – timday
Ist Ihre Produktions-Array-Größe tatsächlich größer als 512^3? Ich bin nicht sicher, warum Sie etwas wie 4x die RAM-Nutzung sehen, die ich in meinem obigen Beispielcode sehe ... – slacy
Bitte überarbeiten Sie das Bit, wo Sie sagen: "Single-Precision existiert nicht, da Ihre native Hardware 128-Bit ist" - native Hardware ist nicht mehr 128 Bit als 64 Bit, und FFTW ist sehr flexibel bei der Unterstützung beider. Wie die Antwort von David zeigt, unterstützt 'scipy.fftpack.rfft' folgendes:' scipy.fftpack.rfft (v.astype (np.float32)) .dtype gibt 'float32' zurück. Leider hinkt die Unterstützung von Numpy selbst im Jahr 2015 hinter Scipy zurück: https://github.com/numpy/numpy/issues/6012 –