هل هناك طريقة لتقليل الدقة Scipy/Numpy لتقليل استهلاك الذاكرة؟

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

سؤال

على نظام Debian/Lenny الخاص بي 64 بت (4GBYTE RAM + 4GBYTE SWAP) يمكنني القيام بنجاح:

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 بت ونصف الذاكرة.

هل كانت مفيدة؟

المحلول

لا يبدو أن هناك أي وظيفة للقيام بذلك في وظائف Scipy's FFT (انظر http://www.astro.rug.nl/efidad/scipy.fftpack.basic.html ).

ما لم تكن قادرًا على العثور على مكتبة FFT ذات النقطة الثابتة لـ Python ، فمن غير المرجح أن تكون الوظيفة التي تريدها موجودة ، نظرًا لأن تنسيق النقطة العائمة للأجهزة الأصلية هو 128 بت. يبدو أنه يمكنك استخدام طريقة RFFT للحصول على المكونات ذات القيمة الحقيقية (بدون مرحلة) من FFT ، وهذا من شأنه أن يوفر نصف ذاكرة الوصول العشوائي.

ركضت ما يلي في بيثون التفاعلي:

>>> 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 265 ميجابايت.

f = fft.fft(v)

وفي هذه المرحلة ، RSS من Python 2.3 جيجابايت.

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

وفي هذه المرحلة ، انخفض RSS إلى 2.0 جيجابايت ، لأنني أحرص على ذلك.

باستخدام "fft.rfft (v)" لحساب القيم الحقيقية يؤدي فقط إلى 1.3 جيجابايت RSS. (ما يقرب من النصف ، كما هو متوقع)

عمل:

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

هو الأسوأ في كلا العالمين ، لأنه يقوم أولاً بحساب إصدار Complex128 (2.3 جيجابايت) ، ثم ينسخ ذلك في إصدار Complex64 (1.3 جيجابايت) مما يعني أن الذروة RSS على الجهاز الخاص بي كانت 3.6 جيجابايت ، ثم استقرت إلى 1.3 جيجابايت تكرارا.

أعتقد أنه إذا كان لديك ذاكرة الوصول العشوائي بسعة 4 جيجابايت ، فيجب أن يعمل كل هذا بشكل جيد (كما هو الحال بالنسبة لي). ما هي المشكلة؟

نصائح أخرى

سيكون Scipy 0.8 دعمًا دقيقًا لجميع كود FFT تقريبًا (الرمز موجود بالفعل في الجذع ، بحيث يمكنك تثبيت Scipy من SVN إذا كنت بحاجة إلى الميزة الآن).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top