이 있을 줄일 수 있는 방법을 scipy/numpy 정밀도 메모리 사용량을 줄이기 위해?

StackOverflow https://stackoverflow.com/questions/620428

문제

에 나 64-bit Debian/Lenny 시스템(4GByte RAM+4GByte 스왑 파티션)내가 성공적으로 할 수 있다:

v=array(10000*random([512,512,512]),dtype=np.int16)
f=fftn(v)

하지만으로 f 는 np.complex128 메모리 소비가 충격,그리고 나는 할 수 없으로 더 많은 결과(e.g 조절 계수 한 다음 f=ifftn(f) )없이 MemoryError 추적.

오히려 설치하는 것보다 좀 더 램 및/또는 확장 내 스왑 파티션,거기에 몇 가지를 제어하는 방법 scipy/numpy"기본값 정밀도"하고 계산 complex64 배열을까요?

라는 것을 저는 확신만 줄이 나중에 그것과 f=array(f,dtype=np.complex64);내가 찾는 그것을 실제적으로 FFT 작업에서 32 비트 정밀도와 반합니다.

도움이 되었습니까?

해결책

그것처럼 보이지 않는 거의 모든 기능을 이렇게 scipy 의 fft 기능(보 http://www.astro.rug.nl/efidad/scipy.fftpack.basic.html ).

지 않는 한 당신을 찾을 수있는 고정점 FFT 라이브러리를 위한 파이썬은,그것이 당신이 원하는 기능이 존재하기 때문에,네이티브 하드웨어 부동 소수점 포맷은 128 비트입니다.그것처럼 사용할 수 있습니다 rfft 를 얻을 수 있는 방법 그 실제 가치 구성 요소(단계)의 FFT,그리고 저장 반니다.

나는 다음에 대화 형 python:

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

이 시점에서는 RSS(주민이 설정한 크기)의 python 었 265MB.

f = fft.fft(v)

고 이 시점에서 RSS 의 python2.3GB.

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

고 이 시점에서 RSS 를 2.0GB 때문에,내가 무료로 최대 v.

를 사용하여"fft.rfft(v)"을 계산 실제 값 만에 결과를 1.3GB RSS.(거의 절반으로 예상되)

하:

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

은 두 세계의 최악의 이후,그것은 첫째 계산 complex128 버전(2.3GB)한 후 복사본으로 complex64 버전(1.3GB)의 피크 RSS 내 컴퓨터에 3.6GB,다음 정착 1.3GB again.

내가 생각하는 경우에 당신은 4GB RAM,이 모든 일이 그냥 좋(에 대해서와 마찬가지로 나에게).무엇이 문제인가요?

다른 팁

Scipy0.8 야 할 것이 하나의 정밀도 지원에 대한 거의 모든 fft 코드(코드에 이미 트렁크,그래서 당신이 설치할 수 있습 scipy 에서 svn 필요할 경우 기능 지금).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top