আকৃতি এবং ডেটা টাইপ সহ অ্যারে বরাদ্দ করতে অক্ষম


103

আমি MacOS এ একই সমস্যার মুখোমুখি না হয়ে উবুন্টু 18-তে নম্পরায় বিশাল অ্যারে বরাদ্দের একটি সমস্যার মুখোমুখি।

আমি আকারের (156816, 36, 53806) সাথে একটি নমপি অ্যারের জন্য মেমরি বরাদ্দ করার চেষ্টা করছি

np.zeros((156816, 36, 53806), dtype='uint8')

এবং আমি উবুন্টু ওএসে একটি ত্রুটি পেয়েছি

>>> import numpy as np
>>> np.zeros((156816, 36, 53806), dtype='uint8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
numpy.core._exceptions.MemoryError: Unable to allocate array with shape (156816, 36, 53806) and data type uint8

আমি ম্যাকওএস এ পাচ্ছি না:

>>> 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)

আমি কোথাও পড়েছি np.zerosযা অ্যারের জন্য প্রয়োজনীয় পুরো মেমরিটিকে সত্যিকার অর্থে বরাদ্দ করা উচিত নয়, তবে কেবল অ-শূন্য উপাদানগুলির জন্য। যদিও উবুন্টু মেশিনটিতে 64 গিগাবাইট মেমরি রয়েছে তবে আমার ম্যাকবুক প্রোটিতে কেবল 16 জিবি রয়েছে।

সংস্করণ:

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

পিএস: গুগল কোলাবেও ব্যর্থ হয়েছে


4
স্মৃতিতে কি অন্যান্য প্রক্রিয়া চলছে?
ব্লুরাইন এস

নাহ, আমি চেষ্টা করেছি topএবং free -m, সেই কমান্ডগুলি যেখানে 60gb মেমো ফ্রি এবং আরও অনেক কম করে দেয়
মার্টিন ব্রিসিয়াক

হুমমম। অদ্ভুত যে এত স্মৃতি গ্রহণ করা উচিত নয়। এটি ম্যাকোসের উপর কত স্মৃতি ধারণ করেছে?
ব্লুরাইন এস

4
অসম্ভব, তবে আপনি উবুন্টুতে 32 বিট পাইথন ইন্টারপ্রেটারটি চালিয়ে যাচ্ছেন না?
jdehesa

4
np.zerosএকটি sparseম্যাট্রিক্স তৈরি করে না । জিরোগুলি পূরণ করতে হয়ত দেরি হবে। কিন্তু দেখতে stackoverflow.com/q/27464039
hpaulj

উত্তর:


106

এটি সম্ভবত আপনার সিস্টেমের ওভার কমিট হ্যান্ডলিং মোডের কারণে ।

ডিফল্ট মোডে 0,

হিউরিস্টিক ওভার কমিট হ্যান্ডলিং। ঠিকানার জায়গার সুস্পষ্ট ওভার কমিটগুলি অস্বীকার করা হয়েছে। একটি সাধারণ সিস্টেমের জন্য ব্যবহৃত হয়। ওভার কমিটকে অদলবদলের ব্যবহার হ্রাস করার অনুমতি দেওয়ার সাথে সাথে এটি মারাত্মকভাবে বন্য বরাদ্দ ব্যর্থ হওয়ার বিষয়টি নিশ্চিত করে। এই মোডে রুটটিকে কিছুটা বেশি মেমরি বরাদ্দ করার অনুমতি দেওয়া হয়। এটি ডিফল্ট।

ব্যবহৃত সঠিক হিউরিস্টিকটি এখানে ভালভাবে ব্যাখ্যা করা যায় না, তবে এটি লিনাক্সের উপর কমিট কমিটরিএই পৃষ্ঠায় বেশি আলোচনা করা হয় ।

আপনি চালিয়ে আপনার বর্তমান ওভারকমিট মোডটি পরীক্ষা করতে পারেন

$ cat /proc/sys/vm/overcommit_memory
0

এক্ষেত্রে আপনি বরাদ্দ দিচ্ছেন

>>> 156816 * 36 * 53806 / 1024.0**3
282.8939827680588

2 ২৮২ গিগাবাইট, এবং কার্নেলটি স্পষ্টতই বলছে যে এটির জন্য আমি কোনও দৈহিক পৃষ্ঠাগুলি কমিট করতে সক্ষম হচ্ছি না এবং এটি বরাদ্দকে অস্বীকার করে।

যদি (রুট হিসাবে) আপনি চালান:

$ echo 1 > /proc/sys/vm/overcommit_memory

এটি "সর্বদা ওভারকমিট" মোড সক্ষম করবে এবং আপনি দেখতে পাবেন যে সিস্টেমটি আপনাকে বরাদ্দটি কত বড় তা বিবেচনা করার অনুমতি দেবে (কমপক্ষে 64৪-বিট মেমরির ঠিকানা দিয়ে)।

আমি 32 গিগাবাইট র‌্যাম সহ একটি মেশিনে এটি পরীক্ষা করেছি। ওভারকমিট মোডের সাহায্যে 0আমি একটিও পেয়েছি MemoryErrorতবে এটিকে আবার পরিবর্তন করার পরে 1এটি কাজ করে:

>>> import numpy as np
>>> a = np.zeros((156816, 36, 53806), dtype='uint8')
>>> a.nbytes
303755101056

তারপরে আপনি এগিয়ে যান এবং অ্যারের মধ্যে যে কোনও স্থানে লিখতে পারেন এবং আপনি কেবলমাত্র সেই পৃষ্ঠাটিতে স্পষ্টভাবে লিখলে সিস্টেমটি কেবল শারীরিক পৃষ্ঠাগুলি বরাদ্দ করবে। তাই আপনি যত্ন সহকারে স্পারস অ্যারে ব্যবহার করতে পারেন।


4
এটি বিশেষত লিনাক্স কার্নেলের একটি বৈশিষ্ট্য তাই সম্ভবত ম্যাকওএস-তে সরাসরি সমতুল্য নয়, যদিও সম্ভবত কিছু অনুরূপ something আমি মনে করি না যে ম্যাক্সের পক্ষে কর্ডেল কার্নেল সেটিংসকে টুডল করা সহজ।
ইগুয়ানাট

4
@ আইগানানৌত "যত্ন সহকারে" সতর্কতার সঠিক অর্থ কী? অর্থাত্ জিটিএক্স 1080 জিপিইউ সহ উবুন্টু 18 সার্ভারে এটির সাথে কোনও সমস্যা হওয়ার সবচেয়ে খারাপ পরিস্থিতি কী?
mLstudent33

4
@ mLstudent33 সবার জন্য এটির আপনার জিপিইউর সাথে কোনও সম্পর্ক নেই, যার নিজস্ব স্মৃতি রয়েছে। আমার অর্থ হ'ল আপনি এখনও আপনার স্মৃতি পূরণ করতে পারেন - প্রতিবার মেমোরিতে কোনও পৃষ্ঠায় লিখলে সেই পৃষ্ঠাটি (সাধারণত 4 কে বাইট) অবশ্যই শারীরিক স্মৃতিতে প্রতিশ্রুতিবদ্ধ হতে হবে। সুতরাং সবচেয়ে খারাপ পরিস্থিতি আপনার স্মৃতিশক্তি হারিয়েছে।
ইগুয়ানানাট

4
এই পরিবর্তনটি তাত্ক্ষণিকভাবে কার্যকর হয় বা আমাদের শেল বা মেশিনটি নিজেই পুনরায় চালু করতে হবে?
ডাম্বলডেড

4
এটি তাত্ক্ষণিকভাবে কার্যকর হয়, তবে এটি অতিরিক্ত ব্যবস্থা ছাড়াই পুনরায় বুট করার পরেও চলবে না। /proc/sysআপনার বিতরণে কীভাবে সেরা সেটিংস বজায় রাখা যায় তা নিয়ে অন্যান্য প্রশ্ন অনুসন্ধান করুন।
ইগুয়ানাউত

44

উইন্ডোতেও আমার একই সমস্যা ছিল এবং আমি এই সমাধানটি পেলাম। সুতরাং যদি কেউ এই সমস্যাটি উইন্ডোজে আসে তবে আমার পক্ষে সমাধানটি ছিল পেজ ফাইলের আকার বাড়াতে , কারণ এটি আমার জন্য একটি মেমরি ওভার কমিটমেন্ট সমস্যাও ছিল।

জানালা 8

  1. কীবোর্ডে উইন্ডোজকি + এক্স টিপুন এবং তারপরে পপআপ মেনুতে সিস্টেম ক্লিক করুন
  2. উন্নত সিস্টেম সেটিংস আলতো চাপুন বা ক্লিক করুন। আপনাকে প্রশাসকের পাসওয়ার্ডের জন্য বা আপনার পছন্দটি নিশ্চিত করতে বলা হতে পারে
  3. উন্নত ট্যাবে, পারফরম্যান্সের অধীনে, সেটিংসে আলতো চাপুন বা ক্লিক করুন।
  4. উন্নত ট্যাবে আলতো চাপুন বা ক্লিক করুন, এবং তারপরে, ভার্চুয়াল মেমরির নীচে, আলতো চাপুন বা পরিবর্তন ক্লিক করুন
  5. সমস্ত ড্রাইভের জন্য স্বয়ংক্রিয়ভাবে পেজিং ফাইল আকার পরিচালনা করুন চেক বাক্স সাফ করুন।
  6. ড্রাইভ [ভলিউম লেবেল] এর অধীনে, আপনি পরিবর্তন করতে চান এমন পেজিং ফাইল রয়েছে এমন ড্রাইভে আলতো চাপুন বা ক্লিক করুন
  7. কাস্টম সাইজে আলতো চাপুন বা ক্লিক করুন, প্রারম্ভিক আকারে (এমবি) বা সর্বাধিক আকার (এমবি) বাক্সে একটি নতুন আকার মেগাবাইটে প্রবেশ করুন, আলতো চাপুন বা সেট করুন ক্লিক করুন, এবং তারপরে আলতো চাপুন বা ঠিক আছে ক্লিক করুন
  8. আপনার সিস্টেমটি পুনরায় বুট করুন

উইন্ডোজ 10

  1. উইন্ডোজ কী টিপুন
  2. টাইপ করুন সিস্টেমপ্রসেসি অ্যাডভান্সড
  3. প্রশাসক হিসাবে রান ক্লিক করুন
  4. সেটিংস ক্লিক করুন
  5. উন্নত ট্যাবটি নির্বাচন করুন
  6. পরিবর্তন নির্বাচন করুন ...
  7. সমস্ত ড্রাইভের জন্য পেজিং ফাইলের আকারটি স্বয়ংক্রিয়ভাবে পরিচালনা করে নিন che
  8. তারপরে কাস্টম আকার নির্বাচন করুন এবং উপযুক্ত আকারটি পূরণ করুন
  9. সেট টিপুন ওকে চাপুন তারপরে ভার্চুয়াল মেমরি, পারফরম্যান্স বিকল্প এবং সিস্টেম বৈশিষ্ট্য ডায়ালগ থেকে প্রস্থান করুন
  10. আপনার সিস্টেমটি পুনরায় বুট করুন

দ্রষ্টব্য: আমার সিস্টেমে এই উদাহরণে ~ 282 গিগাবাইটের জন্য পর্যাপ্ত মেমরি নেই তবে আমার বিশেষ ক্ষেত্রে এটি কাজ করেছে।

সম্পাদনা

থেকে এখানে প্রস্তাব পৃষ্ঠা ফাইল সাইজ জন্য সুপারিশ:

সঠিক পেজফাইলে আকার নির্ধারণের জন্য একটি সূত্র রয়েছে। প্রাথমিক আকারের পরিমাণ দেড় (1.5) x মোট সিস্টেম মেমরির পরিমাণ। সর্বাধিক আকার তিনটি (3) x প্রাথমিক আকারের। সুতরাং ধরা যাক আপনার কাছে 4 গিগাবাইট (1 গিগাবাইট = 1,024 এমবি x 4 = 4,096 এমবি) মেমরি রয়েছে। প্রাথমিক আকারটি 1.5 x 4,096 = 6,144 মেগাবাইট এবং সর্বোচ্চ আকার 3 x 6,144 = 18,432 এমবি হবে।

এখান থেকে কিছু বিষয় মনে রাখতে হবে :

তবে এটি আপনার কম্পিউটারের জন্য অনন্য হতে পারে এমন অন্যান্য গুরুত্বপূর্ণ কারণ ও সিস্টেম সেটিংস বিবেচনায় নেবে না। আবার, উইন্ডোজ কোনও আলাদা কম্পিউটারে কাজ করে এমন কিছু স্বেচ্ছাসেবী সূত্রে নির্ভর করার পরিবর্তে কী ব্যবহার করবেন তা বেছে নিতে দিন।

এছাড়াও:

পৃষ্ঠার ফাইলের আকার বাড়ানো উইন্ডোজে অস্থিরতা এবং ক্রাশ প্রতিরোধে সহায়তা করতে পারে। তবে, হার্ড ড্রাইভের পড়ার / লেখার সময়গুলি ধীরে ধীরে ধীরে ধীরে তার চেয়ে বেশি হবে যদি ডেটা আপনার কম্পিউটারের স্মৃতিতে থাকে। একটি বৃহত্তর পৃষ্ঠার ফাইল থাকা আপনার হার্ড ড্রাইভের জন্য অতিরিক্ত কাজ যুক্ত করতে চলেছে, যার ফলে সমস্ত কিছু ধীর হয়ে চলেছে। পৃষ্ঠার ফাইলের আকারটি কেবলমাত্র মেমরির বাইরে থাকা ত্রুটিগুলির মুখোমুখি হওয়ার সময় এবং শুধুমাত্র একটি অস্থায়ী স্থির হিসাবে বাড়ানো উচিত। কম্পিউটারে আরও মেমরি যুক্ত করা একটি ভাল সমাধান।


আপনার এখনই কোন কাস্টম আকার (প্রাথমিক আকার + সর্বাধিক আকার) সেটিংস আছে? নিজের জন্য কত বরাদ্দ হবে তা নিশ্চিত নন
আজিজব্রো

4
@ আজিজব্রো আমি এখনই ডিফল্টটিতে ফিরে এসেছি তবে মেমরির বাইরে থাকা ত্রুটি অদৃশ্য হওয়া পর্যন্ত মানগুলি সামঞ্জস্য করেছি।
পুনরাবৃত্তির জন্য

23

আমি উইন্ডোজেও এই সমস্যাটি পেলাম। আমার জন্য সমাধানটি ছিল 32-বিট থেকে পাইথনের একটি 64-বিট সংস্করণে । আসলে, 32-বিট সিপিইউর মতো একটি 32-বিট সফ্টওয়্যার সর্বোচ্চ 4 গিগাবাইট র‍্যাম (2 ^ 32) অ্যাড্রেস করতে পারে । সুতরাং আপনার যদি 4 গিগাবাইটের বেশি র‌্যাম থাকে তবে একটি 32-বিট সংস্করণ এর সুবিধা নিতে পারে না।

পাইথনের একটি 64-বিট সংস্করণ ( ডাউনলোড পৃষ্ঠায় x86-64 লেবেলযুক্ত ) দিয়ে সমস্যাটি অদৃশ্য হয়ে গেল।

দোভাষী প্রবেশ করে আপনি কোন সংস্করণটি পরীক্ষা করতে পারেন। আমার, এখন একটি Python 3.7.5rc1 (tags/v3.7.5rc1:4082f600a5, Oct 1 2019, 20:28:14) [MSC v.1916 64 bit (AMD64)]-৪ -বিট সংস্করণ রয়েছে: যেখানে [এমএসসি ভি .১৯১16 64৪ বিট (এএমডি )৪)] এর অর্থ "-৪-বিট পাইথন"।

দ্রষ্টব্য : এই লেখার সময় হিসাবে (মে 2020),ম্যাটপ্ল্লোলিব পাইথন 39 এ পাওয়া যায় না , তাই আমি পাইথন 37, 64 বিট ইনস্টল করে পুনঃস্থাপন করি।

সূত্র:


ধন্যবাদ. শেষ স্থিতিশীল -৪-বিট পাইথন সংস্করণ (৩.৮.৩) এর সাথে আমি ম্যাটপ্লটলিবও ইনস্টল করতে পারি।
ফেডেরিকো তোমাসি

4
আমি কীভাবে দোভাষী প্রবেশ করব?
শায়ান

আমার সমস্যাও সমাধান করেছেন। পাইচার্ম ব্যবহার করা হচ্ছে। আনইনস্টল করা 32-বিট সংস্করণ, stal৪-বিট এক পুনরায় ইনস্টল করা, প্রকল্পের দোভাষীকে নতুন -৪-বিট পাইথনে পরিবর্তিত করেছে।
জেসন গোল

3

আমার ক্ষেত্রে, একটি dtype বৈশিষ্ট্য যুক্ত করে অ্যারের dtype পরিবর্তন করে একটি ছোট প্রকারে (ফ্লোট 64 থেকে uint8), অ্যারে আকার হ্রাস করে উইন্ডোজ (Mem৪ বিট) এ মেমোরির নিক্ষেপ না করার জন্য যথেষ্ট পরিমাণে হ্রাস পেয়েছে।

থেকে

mask = np.zeros(edges.shape)

প্রতি

mask = np.zeros(edges.shape,dtype='uint8')

2

কার্নেল এর সীমাতে পৌঁছে যাওয়ার কারণে কখনও কখনও এই ত্রুটিটি পপ আপ হয়। প্রয়োজনীয় পদক্ষেপগুলি আবারও কর্নেলটি পুনরায় চালু করার চেষ্টা করুন।


4
দয়া করে রেফার করুন: স্ট্যাকওভারফ্লো . com / help / how-to-answer ভাল প্রচেষ্টা।
কিশান মেহতা

1

ডেটা টাইপটিকে অন্য কোনওটিতে পরিবর্তন করুন যা কম মেমোরি কাজ করে। আমার জন্য, আমি ডেটা টাইপটিকে numpy.uint8 এ পরিবর্তন করি:

data['label'] = data['label'].astype(np.uint8)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.