سؤال

أحاول تشغيل البرنامج التالي الذي يحسب جذور كثيرات الحدود من الدرجة يصل إلى د مع معاملات فقط +1 أو -1, ومن ثم تخزينها في ملفات.

d = 20; n = 18000; 
f[z_, i_] := Sum[(2 Mod[Floor[(i - 1)/2^k], 2] - 1) z^(d - k), {k, 0, d}];

هنا و[z i] يعطي متعدد الحدود في z مع زائد أو ناقص علامات العد الثنائية.يقول د=2, كنا

و[z 1] = -z2 - z - 1
و[z 2] = -z2 - z + 1
و[z,3] = -z2 + z - 1
و[z 4] = -z2 + z + 1

DistributeDefinitions[d, n, f]

ParallelDo[ 
            Do[ 
                     root = N[Root[f[z, i], j]];
                     {a, b} = Round[n ({Re[root], Im[root]}/1.5 + 1)/2];
            {i, 1, 2^d}],
{j, 1, d}]

أدرك أن قراءة هذا ربما ليست ممتعة جدا لكنها قصيرة نسبيا على أي حال.لقد حاولت أن تقطع إلى الأجزاء ذات الصلة ، ولكن هنا أنا حقا ليس لدي أي فكرة ما هي المشاكل.أنا حساب كل جذور f[z i] ثم جولة لجعلها تتوافق مع نقطة في n n شبكة و حفظ البيانات في الملفات المختلفة.

لسبب ما, استخدام الذاكرة في الرياضيات تزحف حتى يملأ كل الذاكرة (6 GB على هذا الجهاز);ثم حساب تواصل للغاية ببطء ؛ لماذا هذا ؟

أنا لست متأكدا ما هو استخدام الذاكرة هنا - بلدي تخمين فقط كان تيار من الملفات المستخدمة من الذاكرة ، ولكن ليس هذا هو الحال:حاولت إلحاق البيانات إلى 2GB الملفات و لم يكن هناك ملحوظة استخدام الذاكرة في ذلك.يبدو أن هناك على الإطلاق أي سبب الرياضيات إلى استخدام كميات كبيرة من الذاكرة هنا.

الصغيرة القيم د (15 على سبيل المثال) ، السلوك التالية:عندي 4 حبات تشغيل.كما أنهم جميعا من خلال تشغيل ParallelDo حلقة (كل فعل قيمة ي في وقت واحد) ، يزيد استخدام الذاكرة ، حتى أنهم جميعا الانتهاء من الذهاب من خلال تلك الحلقة مرة واحدة.ثم في المرات القادمة يذهبون من خلال تلك الحلقة ، استخدام الذاكرة لا يزيد على الإطلاق.حساب في نهاية المطاف ينتهي وكل شيء على ما يرام.

أيضا, جدا والأهم من ذلك ، مرة واحدة على حساب توقف استخدام الذاكرة لا تذهب مرة أخرى إلى أسفل.إذا كنت تبدأ في حساب أخرى ، يحدث ما يلي:

-إذا كان حساب السابقة توقفت عند استخدام الذاكرة لا تزال في ازدياد ، فإنه يستمر في زيادة (قد يستغرق بعض الوقت لبدء زيادة مرة أخرى في الأساس للوصول إلى نفس النقطة في الحساب).

-إذا كان حساب السابقة توقفت عند استخدام الذاكرة لا زيادة لا زيادة.

تحرير: مسألة يبدو أن تأتي من التعقيد النسبي من f - تغيير في بعض أسهل متعدد الحدود يبدو لإصلاح المشكلة.ظننت أن المشكلة قد يكون أن الرياضيات يتذكر f[z i] من أجل قيم محددة لكن الإعداد و[z i] :=.فقط بعد حساب الجذر f[z i] يشكو من أن المهمة لم تكن موجودة في المقام الأول, و الذاكرة لا تزال تستخدم.

إنه أمر محير حقا ، و هو الوحيد المتبقي شيء يمكنني تخيل تناول الذاكرة ، ولكن تحديد و في الداخلية هل حلقة وتطهير كل مرة بعد الجذر هو حساب لا يحل المشكلة.

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

المحلول

أوتش, هذه هي سيئة واحدة.

ما يحدث هو أن N سوف تفعل التخزين المؤقت من النتائج من أجل تسريع حسابات المستقبل إذا كنت في حاجة إليها مرة أخرى.في بعض الأحيان هذا هو تماما ما تريد, ولكن في بعض الأحيان أنها مجرد فواصل العالم.لحسن الحظ لديك بعض الخيارات.واحد هو استخدام ClearSystemCache الأمر الذي لا مجرد ما قال على القصدير.بعد أن ركض الخاص للأمم المتحدة بشكل متوازي حلقة لبعض الوقت (قبل ملل و إحباط حساب), MemoryInUse ذكرت ~160 MiB في الاستخدام.باستخدام ClearSystemCache حصلت إلى أسفل إلى حوالي 14 MiB.

شيء واحد يجب أن ننظر به, بدلا من الدعوة ClearSystemCache برمجيا ، SetSystemOptions إلى تغيير سلوك التخزين المؤقت.يجب أن نلقي نظرة على SystemOptions["CacheOptions"] لمعرفة ما هي الاحتمالات.

تحرير: ليس بشكل رهيب من المستغرب أن التخزين المؤقت يسبب مشكلة أكبر بالنسبة تعبيرات أكثر تعقيدا.انها حصلت على أن يكون إخفاء نسخ من تلك التعبيرات في مكان ما, و تعبيرات أكثر تعقيدا تتطلب المزيد من الذاكرة.

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