Existe-t-il un moyen de réduire la précision scipy / numpy pour réduire la consommation de mémoire?

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

Question

Sur mon système Debian / Lenny 64 bits (4 Go de RAM + 4 Go de partition swap), je peux réussir:

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

mais avec f étant un np.complex128 , la consommation de mémoire est choquante, et je ne peux pas en faire plus avec le résultat (par exemple, moduler les coefficients puis f = ifftn (f ) ) sans une trace MemoryError .

Plutôt que d’installer plus de RAM et / ou d’étendre mes partitions d’échange, existe-t-il un moyen de contrôler la "précision par défaut" scipy / numpy et le faire calculer un tableau complex64 à la place?

Je sais que je peux simplement le réduire par la suite avec f = tableau (f, type = np.complex64) ; Je souhaite que la FFT fonctionne réellement avec une précision de 32 bits et la moitié de la mémoire.

Était-ce utile?

La solution

Il ne semble y avoir aucune fonction permettant de faire cela dans les fonctions fft de scip (voir http://www.astro.rug.nl/efidad/scipy.fftpack.basic.html ).

À moins que vous ne puissiez trouver une bibliothèque FFT à point fixe pour python, il est peu probable que la fonction souhaitée existe, car le format de virgule flottante de votre matériel natif est de 128 bits. Il semblerait que vous puissiez utiliser la méthode rfft pour obtenir uniquement les composants à valeur réelle (sans phase) de la FFT, ce qui économiserait la moitié de votre RAM.

J'ai exécuté ce qui suit en python interactif:

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

À ce stade, le format RSS (taille de l'ensemble de résidents) de python était de 265 Mo.

f = fft.fft(v)

Et à ce stade, le flux RSS de python 2.3GB.

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

Et à ce stade, le RSS descend à 2,0 Go, depuis que j'ai libéré v.

Utilisation de " fft.rfft (v) " pour calculer des valeurs réelles, le résultat est un RSS de 1,3 Go. (presque la moitié, comme prévu)

Faire:

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

Est le pire des deux mondes, puisqu'il calcule d'abord la version complex128 (2,3 Go), puis la copie dans la version complex64 (1,3 Go), ce qui signifie que le pic de RSS sur ma machine était de 3,6 Go, puis s'est installé à 1,3 Go à nouveau.

Je pense que si vous avez 4 Go de RAM, tout devrait fonctionner correctement (comme cela se produit pour moi). Quel est le problème?

Autres conseils

Scipy 0.8 supportera la précision simple pour presque tout le code fft (le code est déjà dans le coffre, vous pouvez donc installer scipy à partir de svn si vous avez besoin de cette fonctionnalité maintenant).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top