Sur mon 64 bits Debian/système Lenny (4 Gbytes RAM + 4 Gbytes partition de swap) Je peux faire avec succès:Existe-t-il un moyen de réduire la précision scipy/numpy pour réduire la consommation de mémoire?
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 choquant, et je ne peux pas faire grand-chose plus avec le résultat (par exemple, moduler les coefficients, puis f=ifftn(f)
) sans traceback MemoryError
. Plutôt que d'installer plus de RAM et/ou d'étendre mes partitions de swap, existe-t-il un moyen de contrôler la "précision par défaut" de scipy/numpy et de lui faire calculer un tableau complex64 à la place?
Je sais que je peux juste le réduire par la suite avec f=array(f,dtype=np.complex64)
; Je cherche à faire en sorte que la FFT fonctionne en précision 32 bits et en mémoire.
Merci pour le pointeur sur les fonctions rfftn; oui ceux qui font le travail bien. L'utilisation maximale pour f = rfftn (v), f = array (f, dtype = np.complex64), f = irfftn (f) est 6224MByte dans l'inverse. (Sans le casting intermédiaire à complex64, il utilise 7754MByte ... un peu serré). – timday
Votre taille de tableau de production est-elle réellement supérieure à 512^3? Je ne suis pas sûr pourquoi vous voyez quelque chose comme 4x l'utilisation de la RAM que je vois dans mon exemple de code ci-dessus ... – slacy
Veuillez réviser le bit où vous dites que «la précision unique n'existe pas puisque votre matériel natif est de 128 bits». Le matériel natif n'est plus 128 bits que 64 bits, et FFTW est très flexible pour supporter les deux. Comme la réponse de David l'indique, 'scipy.fftpack.rfft' supporte ceci:' scipy.fftpack.rfft (v.astype (np.float32)) .dtype' renvoie 'float32'. Malheureusement, le soutien de Numpy est à la traîne de Scipy's, même en 2015: https://github.com/numpy/numpy/issues/6012 –