(4GB로 RAM + 4GB로 스왑 파티션) 나는 성공적으로 수행 할 수 메모리 소비를 줄이기 위해 scipy/numpy 정밀도를 줄이는 방법이 있습니까? 내 64 비트 데비안/레니 시스템에서
v=array(10000*random([512,512,512]),dtype=np.int16)
f=fftn(v)
하지만 F와
되np.complex128
메모리 소비는 충격적이다, 나는 많은 것을 할 수 없다
MemoryError
추적없이 결과에 더 많은 것을 (예를 들면 계수를 변조하고
f=ifftn(f)
).
RAM을 추가로 설치하거나 스왑 파티션을 확장하는 대신 scipy/numpy "기본 정밀도"를 제어하고 대신 complex64 배열을 계산하는 방법이 있습니까?
내가 나중에 줄일 수 있다는 것을 안다. f=array(f,dtype=np.complex64)
; 나는 실제로 32 비트 정밀도와 절반의 메모리에서 FFT 작업을 수행하도록하고있다.
rfftn 함수에 대한 포인터를 보내 주셔서 감사합니다. 네, 그 일을 멋지게합니다. f = rfftn (v), f = array (f, dtype = np.complex64), f = irfftn (f)의 피크 사용량은 역수로 6224MByte입니다. (중간 캐스팅 없이는 complex64로 7754MByte를 사용합니다 ... 조금 빡빡합니다.) – timday
생산 배열 크기가 실제로 512^3보다 큰가요? 왜 위의 예제 코드에서 볼 수 있듯이 RAM 사용량이 4 배인 것과 같은 이유가 있는지 잘 모르겠다. – slacy
네이티브 하드웨어가 128 비트이기 때문에 '단정도가 존재하지 않습니다'라는 비트를 수정하십시오. 네이티브 하드웨어는 64 비트보다 128 비트가 아니며 FFTW는 두 가지를 모두 지원하는 데 매우 융통성이 있습니다. David의 대답에서 알 수 있듯이'scipy.fftpack.rfft'는 이것을 지원합니다 :'scipy.fftpack.rfft (v.astype (np.float32)) .dtype'은'float32'를 반환합니다. 안타깝게도 Numpy의 지원은 2015 년에도 Scipy의 지원보다 뒤쳐져 있습니다. https://github.com/numpy/numpy/issues/6012 –