Ngày 64-bit hệ thống Debian/Lenny của tôi (phân vùng swap 4GByte RAM + 4GByte) Tôi thành công có thể làm:Có cách nào để giảm độ chính xác scipy/numpy để giảm mức tiêu thụ bộ nhớ không?
v=array(10000*random([512,512,512]),dtype=np.int16)
f=fftn(v)
nhưng với f là một np.complex128
tiêu thụ bộ nhớ là gây sốc, và tôi không thể làm được gì nhiều nhiều hơn với kết quả (ví dụ: điều chỉnh các hệ số và sau đó là f=ifftn(f)
) mà không cần truy nguyên MemoryError
.
Thay vì cài đặt thêm RAM và/hoặc mở rộng phân vùng trao đổi, có cách nào để kiểm soát độ chính xác mặc định của "scipy/numpy" và có tính toán mảng phức64 không?
Tôi biết tôi chỉ có thể giảm sau đó với f=array(f,dtype=np.complex64)
; Tôi đang tìm cách để nó thực sự làm công việc FFT trong chính xác 32-bit và một nửa bộ nhớ.
Cảm ơn con trỏ tới các hàm rfftn; có những người làm công việc độc đáo. Sử dụng đỉnh cho f = rfftn (v), f = mảng (f, dtype = np.complex64), f = irfftn (f) là 6224MByte theo nghịch đảo. (Nếu không có dàn diễn viên trung gian đến phức tạp64 nó sử dụng 7754MByte ... hơi chặt). – timday
Kích thước mảng sản xuất của bạn có thực sự lớn hơn 512^3 không? Tôi không chắc chắn lý do tại sao bạn nhìn thấy một cái gì đó như 4x sử dụng RAM mà tôi thấy trong mã ví dụ của tôi ở trên ... – slacy
Vui lòng sửa lại bit mà bạn nói 'độ chính xác đơn không tồn tại vì phần cứng gốc của bạn là 128 bit' — phần cứng gốc không có 128 bit hơn 64 bit và FFTW rất linh hoạt trong việc hỗ trợ cả hai. Như câu trả lời của David cho thấy, 'scipy.fftpack.rfft' hỗ trợ điều này:' scipy.fftpack.rfft (v.astype (np.float32)). Dtype' trả về 'float32'. Thật không may, hỗ trợ Numpy là tụt lại phía sau Sciper, ngay cả trong năm 2015: https://github.com/numpy/numpy/issues/6012 –