На моей 64-битной системе Debian/Lenny (4GByte RAM + 4GByte раздел подкачки), я могу успешно сделать:Есть ли способ уменьшить точность scipy/numpy, чтобы уменьшить потребление памяти?
v=array(10000*random([512,512,512]),dtype=np.int16)
f=fftn(v)
но с F быть np.complex128
потребление памяти шокирует, и я не могу многое сделать больше с результатом (например, модулировать коэффициенты, а затем f=ifftn(f)
) без трассировки MemoryError
.
Вместо того, чтобы устанавливать еще одну оперативную память и/или расширять разделы свопинга, есть ли способ контролировать «точность по умолчанию» scipy/numpy и вычислить ли он массив complex64?
Я знаю, что могу просто уменьшить его после этого f=array(f,dtype=np.complex64)
; Я ищу, чтобы он фактически выполнял работу FFT с 32-битной точностью и половиной памяти.
Спасибо за указатель на функции rfftn; да, они прекрасно выполняют эту работу. Пиковое использование для f = rfftn (v), f = array (f, dtype = np.complex64), f = irfftn (f) - 6224MByte в обратном. (Без промежуточного нажатия на complex64 он использует 7754MByte ... немного туго). – timday
Является ли ваш размер массива на самом деле больше 512^3? Я не уверен, почему вы видите что-то вроде 4x использования ОЗУ, которое я вижу в моем примере кода выше ... – slacy
Пожалуйста, пересмотрите бит, в котором вы говорите: «Точная точность не существует, так как ваше собственное оборудование - это 128-битное» собственное устройство, не более 128 бит, чем 64 бит, и FFTW очень гибко поддерживает оба. Как показывает ответ Дэвида, 'scipy.fftpack.rfft' поддерживает это:' scipy.fftpack.rfft (v.astype (np.float32)). Dtype' возвращает 'float32'. К сожалению, поддержка Numpy отстает от Scipy, даже в 2015 году: https://github.com/numpy/numpy/issues/6012 –