Fahmy Mostafa نشر 21 يوليو 2021 أرسل تقرير نشر 21 يوليو 2021 أواجه مشكلة في عمل allocate مصفوفات ضخمة في numpy على Ubuntu 18 بينما لا أواجه نفس المشكلة على MacOS. أحاول عمل allocate memory لمصفوفة عددية ذات شكل (156816 ، 36 ، 53806) من خلال الكود التالي: >>> import numpy as np >>> np.zeros((156816, 36, 53806), dtype='uint8') أحصل على الخطأ التالي على Ubuntu : numpy.core._exceptions.MemoryError: Unable to allocate array with shape (156816, 36, 53806) and data type uint8 بينما على MacOS أحصل على التالي: >>> import numpy as np >>> np.zeros((156816, 36, 53806), dtype='uint8') array([[[0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0], ..., [0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0]], [[0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0], ..., [0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0]], [[0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0], ..., [0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0]], ..., [[0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0], ..., [0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0]], [[0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0], ..., [0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0]], [[0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0], ..., [0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0]]], dtype=uint8) هنا الإصدارات التي لدي على كل نظام تشغيل: Ubuntu os -> ubuntu mate 18 python -> 3.6.8 numpy -> 1.17.0 mac os -> 10.14.6 python -> 3.6.4 numpy -> 1.17.0 حاولت أيضًا أن أقوم بتنفيذ الأكواد على Google Colab ولم أنجح أيضًا، ما السبب في هذا الأمر؟ 1 اقتباس
0 عبدالله عبدالرحمن11 نشر 21 يوليو 2021 أرسل تقرير نشر 21 يوليو 2021 المشكلة متعلقة بوضع overcommit handling الخاص بنظام التشغيل ووضع overcommit handling الافتراضي هو 0 ، ويمكنك تفحص ذلك بتنفيذ $ cat /proc/sys/vm/overcommit_memory ويمكنك تغيير وضع overcommit handling بتنفيذ الأمر الآتي $ echo 1 > /proc/sys/vm/overcommit_memory هذا سيقوم بتفعيل وضع overcommit دائماً والنظام سيتيح لك عمل allocate مهما كان الحجم اقتباس
1 Ali Haidar Ahmad نشر 21 يوليو 2021 أرسل تقرير نشر 21 يوليو 2021 قد تواجهك نفس المشكلة على Windows10 . لذلك أيضاً إذا واجه شخص ما هذه المشكلة في Windows، فيمكن حله من خلال زيادة حجم ال pagefile (جزء محجوز من ال hard disk يستخدم كامتداد لذاكرة الوصول العشوائي (RAM))، حيث أن المشكلة تتعلق بالذاكرة الزائدة "overcommitment". لذا اتبع الخطوات التالية: 1.اضغط زر إبدأ 2.اكتب SystemPropertiesAdvanced 3.اختر Run as administrator 4. Performance --> اختر Settings --> Advanced --> Change 5.قم بإلغاء تحديد "Automatically managing paging file size for all drives" 6.حدد Custom size --> املأ الحجم المناسب 7.اضغط Set --> OK --> exit من "Virtual Memory" و "Performance Options" و "System Properties Dialog" 8.أعد تشغيل النظام الخاص بك أيضاً هناك حل آخر هو التبديل من إصدار 32 بت إلى إصدار 64 بت من Python. حيث أنه يمكن لبرنامج 32 بت ، مثل وحدة المعالجة المركزية 32 بت ، معالجة 4 جيجابايت كحد أقصى من ذاكرة الوصول العشوائي (2 ^ 32). لذلك إذا كان لديك أكثر من 4 غيغابايت من ذاكرة الوصول العشوائي، فلا يمكن لإصدار 32 بت الاستفادة منها. مع إصدار 64 بت من Python (الإصدار المسمى x86-64 في صفحة التحميل) ، تختفي المشكلة. 2 اقتباس
السؤال
Fahmy Mostafa
أواجه مشكلة في عمل allocate مصفوفات ضخمة في numpy على Ubuntu 18 بينما لا أواجه نفس المشكلة على MacOS.
أحاول عمل allocate memory لمصفوفة عددية ذات شكل (156816 ، 36 ، 53806) من خلال الكود التالي:
أحصل على الخطأ التالي على Ubuntu :
numpy.core._exceptions.MemoryError: Unable to allocate array with shape (156816, 36, 53806) and data type uint8
بينما على MacOS أحصل على التالي:
هنا الإصدارات التي لدي على كل نظام تشغيل:
Ubuntu os -> ubuntu mate 18 python -> 3.6.8 numpy -> 1.17.0 mac os -> 10.14.6 python -> 3.6.4 numpy -> 1.17.0
حاولت أيضًا أن أقوم بتنفيذ الأكواد على Google Colab ولم أنجح أيضًا، ما السبب في هذا الأمر؟
2 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.