نحن نبحث عن تسرب الذاكرة في تطبيقات بيثون

¡حولا! نحن نواصل سلسلة من المنشورات المخصصة لإطلاق الدورة التدريبية "مطور الويب في بيثون" ، ونحن الآن نشارك معك ترجمة مقال آخر مثير للاهتمام.

في Zendesk ، نستخدم Python لإنشاء منتجات تعلم الآلة. في تطبيقات التعلم الآلي ، واحدة من أكثر المشاكل شيوعًا التي واجهناها هي تسرب الذاكرة والارتفاعات. عادةً ما يتم تنفيذ Python code في حاويات باستخدام أطر معالجة موزعة مثل Hadoop و Spark و AWS Batch . يتم تخصيص مقدار ثابت من كل حاوية. بمجرد أن يتجاوز تنفيذ التعليمات البرمجية الحد المحدد للذاكرة ، ستتوقف الحاوية عن العمل بسبب الأخطاء التي تحدث بسبب نقص الذاكرة.



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

  • تخزين طويل للكائنات الكبيرة التي لم يتم حذفها ؛
  • روابط الاسترجاع في الكود ؛
  • مكتبات / ملحقات Base C تؤدي إلى تسرب الذاكرة ؛

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

تتناول هذه المقالة الجوانب التالية:

  • التنميط استخدام ذاكرة التطبيق مع مرور الوقت ؛
  • كيفية التحقق من استخدام الذاكرة في جزء معين من البرنامج ؛
  • نصائح لتصحيح الأخطاء الناجمة عن مشاكل الذاكرة.

التنميط الذاكرة مع مرور الوقت

يمكنك إلقاء نظرة على استخدام الذاكرة المتغيرة أثناء تنفيذ برنامج Python باستخدام حزمة منشئ ملفات الذاكرة .

# install the required packages pip install memory_profiler pip install matplotlib # run the profiler to record the memory usage # sample 0.1s by defaut mprof run --include-children python fantastic_model_building_code.py # plot the recorded memory usage mprof plot --output memory-profile.png 



الشكل أ. تشكيل ملفات الذاكرة كدالة للوقت

يتيح خيار التضمين استخدام الذاكرة من قبل أي عمليات فرعية ناتجة عن عمليات الأصل. يعكس الشكل "أ" عملية التعلم التكراري ، والتي تؤدي إلى زيادة الذاكرة في الدورات في تلك اللحظات التي تتم فيها معالجة حزم بيانات التدريب. يتم حذف الكائنات أثناء جمع البيانات المهملة.

إذا كان استخدام الذاكرة يزداد باستمرار ، فإن هذا يعتبر تهديدًا محتملًا لتسرب الذاكرة. إليك نموذج التعليمات البرمجية الذي يعكس هذا:


الشكل B. زيادة استخدام الذاكرة مع مرور الوقت

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

تفريغ الذاكرة في وقت معين

من المفيد تقدير العدد المتوقع مسبقًا من الكائنات الكبيرة في البرنامج وما إذا كان ينبغي تكرارها و / أو تحويلها إلى تنسيقات مختلفة.

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

 # install muppy pip install pympler # Add to leaky code within python_script_being_profiled.py from pympler import muppy, summary all_objects = muppy.get_objects() sum1 = summary.summarize(all_objects) # Prints out a summary of the large objects summary.print_(sum1) # Get references to certain types of objects such as dataframe dataframes = [ao for ao in all_objects if isinstance(ao, pd.DataFrame)] for d in dataframes: print d.columns.values print len(d) 


الشكل C. عينة تفريغ تفريغ كومة الذاكرة المؤقتة

مكتبة ملفات تعريف مفيدة أخرى هي objgraph ، والتي تتيح لك إنشاء رسوم بيانية للتحقق من أصل الكائنات.

مؤشرات مفيدة

تتمثل الطريقة المفيدة في إنشاء "حالة اختبار" صغيرة تعمل على تشغيل الكود المناسب الذي يؤدي إلى حدوث تسرب للذاكرة. فكر في استخدام مجموعة فرعية من البيانات المحددة عشوائيًا إذا كانت المدخلات الكاملة ستستغرق وقتًا طويلاً للمعالجة.

أداء المهام مع تحميل ذاكرة عالية في عملية منفصلة

بيثون لا يحرر بالضرورة الذاكرة على الفور لنظام التشغيل. للتأكد من تحرير الذاكرة ، يجب عليك بدء عملية منفصلة بعد تنفيذ جزء من التعليمات البرمجية. يمكنك معرفة المزيد عن جامع القمامة في بيثون هنا .

يمكن المصحح إضافة مراجع إلى الكائنات.

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

احذر الحزم التي قد تسبب تسرب الذاكرة.

يمكن أن تتسبب بعض المكتبات في Python في حدوث تسرب ، على سبيل المثال تعاني pandas العديد من مشكلات تسرب الذاكرة المعروفة.
هل لديك مطاردة لطيفة للتسريبات!

روابط مفيدة:

docs.python.org/3/c-api/memory.html
docs.python.org/3/library/debug.html

اكتب التعليقات إذا كانت هذه المقالة مفيدة لك. وأولئك الذين يرغبون في معرفة المزيد عن دورتنا ، ندعوك لفتح يوم ، والذي سيعقد في 22 أبريل.

Source: https://habr.com/ru/post/ar448474/


All Articles