2009-03-06 15 views
7

(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 작업을 수행하도록하고있다.

답변

5

scipy의 fft 함수에서 이것을 수행하는 함수가없는 것 같습니다 (http://www.astro.rug.nl/efidad/scipy.fftpack.basic.html 참조).

파이썬 용 고정 소수점 FFT 라이브러리를 찾을 수 없다면 기본 하드웨어 부동 소수점 형식이 128 비트이므로 원하는 기능이 존재하지 않을 가능성이 있습니다. rfft 메서드를 사용하여 FFT의 실수 값 (phase가없는)을 얻는 것처럼 보이므로 RAM의 절반을 절약 할 수 있습니다. 파이썬의 RSS (상주 설정 크기) 2백65메가바이트했다이 시점에서

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

:

나는 대화 형 파이썬에서 다음을 달렸다.

f = fft.fft(v) 

그리고이 시점에서 파이썬 2.3GB의 RSS입니다.

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

내가 V를 free되기를 한 이후 RSS는 아래 2.0GB로가는이 시점에서

.

"fft.rfft (V)"에만 결과 실제 값을 계산하기 위해 사용 1.3GB RSS.

일 (거의 절반, 예상대로) : 먼저 다음 복사를 complex128 버전 (2.3GB)을 계산하고 있기 때문에,

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

두 세계의 최악이라는 complex64 버전에 (1.3GB) 이는 내 컴퓨터의 최고 RSS가 3.6GB 였고 다시 1.3GB로 내려 갔음을 의미합니다.

4GB RAM이 있다면이 모든 것이 잘 작동해야한다고 생각합니다 (나를 위해 그렇듯이). 그게 무슨 문제 야?

+1

rfftn 함수에 대한 포인터를 보내 주셔서 감사합니다. 네, 그 일을 멋지게합니다. f = rfftn (v), f = array (f, dtype = np.complex64), f = irfftn (f)의 피크 사용량은 역수로 6224MByte입니다. (중간 캐스팅 없이는 complex64로 7754MByte를 사용합니다 ... 조금 빡빡합니다.) – timday

+0

생산 배열 크기가 실제로 512^3보다 큰가요? 왜 위의 예제 코드에서 볼 수 있듯이 RAM 사용량이 4 배인 것과 같은 이유가 있는지 잘 모르겠다. – slacy

+0

네이티브 하드웨어가 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 –

4

Scipy 0.8은 거의 모든 fft 코드에 대해 단 정밀도를 지원합니다 (코드는 이미 트렁크에 있으므로이 기능이 필요한 경우 svn에서 scipy를 설치할 수 있습니다).