En mi sistema Debian/Lenny 64 bits (partición de intercambio 4Gbyte RAM + 4Gbyte) que puedo hacer con éxito:¿Hay alguna forma de reducir la precisión scipy/numpy para reducir el consumo de memoria?
v=array(10000*random([512,512,512]),dtype=np.int16)
f=fftn(v)
pero con f ser un np.complex128
el consumo de memoria es impactante, y no puedo hacer mucho más con el resultado (por ejemplo, modula los coeficientes y luego f=ifftn(f)
) sin un seguimiento de MemoryError
.
En lugar de instalar más RAM y/o expandir mis particiones de intercambio, ¿hay alguna manera de controlar la "precisión predeterminada" scipy/numpy y hacer que calcule una matriz complex64 en su lugar?
Sé que puedo reducirlo después con f=array(f,dtype=np.complex64)
; Estoy buscando que realmente haga el trabajo FFT con precisión de 32 bits y la mitad de la memoria.
Gracias por el puntero a las funciones de rfftn; sí, esos hacen bien el trabajo. Uso máximo para f = rfftn (v), f = array (f, dtype = np.complex64), f = irfftn (f) es 6224MByte en el inverso. (Sin el molde intermedio para complex64 usa 7754MByte ... un poco ajustado). – timday
¿Su tamaño de matriz de producción es realmente mayor que 512^3? No estoy seguro de por qué estás viendo algo así como 4 veces el uso de RAM que veo en mi código de ejemplo anterior ... – slacy
Revise el bit donde dice que "la precisión única no existe porque su hardware nativo es de 128 bits". El hardware nativo no tiene más de 128 bits que 64 bits, y FFTW es muy flexible para admitir ambos. Como indica la respuesta de David, 'scipy.fftpack.rfft' admite esto:' scipy.fftpack.rfft (v.astype (np.float32)). Dtype' devuelve 'float32'. Desafortunadamente, el soporte de Numpy va por detrás de Scipy's, incluso en 2015: https://github.com/numpy/numpy/issues/6012 –