আপনি সম্ভবত বুঝতে পেরেছেন, সমস্যাটি হ'ল আপনি মেমরির একটি বৃহত সংলগ্ন ব্লক বরাদ্দ দেওয়ার চেষ্টা করছেন যা মেমরি বিভাজনের কারণে কাজ করে না। আপনি যা করছেন তা করার দরকার হলে আমি নিম্নলিখিতগুলি করব:
int sizeA = 10000,
sizeB = 10000;
double sizeInMegabytes = (sizeA * sizeB * 8.0) / 1024.0 / 1024.0;
double[][] randomNumbers = new double[sizeA][];
for (int i = 0; i < randomNumbers.Length; i++)
{
randomNumbers[i] = new double[sizeB];
}
তারপরে, একটি নির্দিষ্ট সূচক পেতে আপনি ব্যবহার করবেন randomNumbers[i / sizeB][i % sizeB]
।
আর আপনি যদি সর্বদা মানগুলিতে অ্যাক্সেস করেন তবে অন্য বিকল্পটি বীজ নির্দিষ্ট করতে ওভারলোডড কনস্ট্রাক্টর ব্যবহার করতে পারে । এভাবে আপনি একটি আধা এলোমেলো নম্বর পেয়ে যাবেন (যেমন DateTime.Now.Ticks
) এটি একটি ভেরিয়েবেলে সংরক্ষণ করবেন, তারপরে আপনি যখন তালিকার মধ্য দিয়ে যেতে শুরু করবেন তখন আপনি মূল বীজটি ব্যবহার করে একটি নতুন এলোমেলো উদাহরণ তৈরি করবেন:
private static int randSeed = (int)DateTime.Now.Ticks;
private static Random GetNewRandomIterator()
{
return new Random(randSeed);
}
এটি লক্ষ্য করা গুরুত্বপূর্ণ যে ফ্রেডরিক মার্কের উত্তরে ব্লগটি লিঙ্ক করা ইঙ্গিত দেয় যে সমস্যাটি সাধারণত ঠিকানা জায়গার অভাবের কারণে হয় কারণ এটি 2 জিবি সিএলআর বস্তুর আকার সীমাবদ্ধতার মতো অনেকগুলি অন্যান্য ইস্যুতে তালিকাবদ্ধ করে না (থেকে প্রাপ্ত একটি মন্তব্যে উল্লেখ করা হয়েছে) একই ব্লগে ShuggyCoUk), মেমরির খণ্ডিত হওয়া সম্পর্কে উদ্রেক করে এবং পৃষ্ঠা ফাইলের আকারের প্রভাব (এবং কীভাবে এটি CreateFileMapping
ফাংশনটির ব্যবহারের সাথে সম্বোধন করা যায় ) উল্লেখ করতে ব্যর্থ হয় ।
2 জিবি সীমাবদ্ধতার অর্থ এটি randomNumbers
অবশ্যই 2 জিবি এর চেয়ে কম হওয়া উচিত। যেহেতু অ্যারেগুলি ক্লাস হয় এবং তাদের কিছুতে ওভারহেড থাকে সেগুলির অর্থ এটির একটি অ্যারে double
2 ^ 31 এর পরে আরও ছোট হওয়া দরকার। আমি নিশ্চিত না যে 2 ^ 31 এর পরে দৈর্ঘ্য কতটা ছোট হবে, তবে একটি নেট নেট অ্যারের ওভারহেড? 12 - 16 বাইট নির্দেশ করে।
মেমরি বিভাজন এইচডিডি খণ্ডনের সাথে খুব মিল। আপনার কাছে অ্যাড্রেস স্পেসের 2 জিবি থাকতে পারে, তবে আপনি যখন অবজেক্ট তৈরি এবং ধ্বংস করবেন তখন মানগুলির মধ্যে ফাঁক থাকবে। যদি আপনার বৃহত অবজেক্টের জন্য এই ফাঁকগুলি খুব ছোট হয়, এবং অতিরিক্ত স্থানের জন্য অনুরোধ করা যায় না, তবে আপনি এটি পাবেনSystem.OutOfMemoryException
। উদাহরণস্বরূপ, আপনি যদি 2 মিলিয়ন, 1024 বাইট অবজেক্ট তৈরি করেন তবে আপনি 1.9GB ব্যবহার করছেন। যদি আপনি ঠিকানাটি 3 এর একাধিক না হয়ে থাকে তবে আপনি .6GB মেমরি ব্যবহার করবেন তবে এটি 2024 বাইট ওপেন ব্লকগুলির মধ্যে ঠিকানা স্পেসে ছড়িয়ে দেওয়া হবে। আপনার যদি এমন কোনও বস্তু তৈরি করতে হয় যা .২ গিগাবাইট ছিল তবে আপনি এটি করতে সক্ষম হবেন না কারণ এটিতে ফিট করার মতো কোনও বৃহত ব্লক নেই এবং অতিরিক্ত স্থান পাওয়া যায় না (32 বিট পরিবেশ অনুমান করে)। এই সমস্যার সম্ভাব্য সমাধানগুলি হ'ল ছোট জিনিসগুলি ব্যবহার করা, মেমরিতে আপনি যে পরিমাণ ডেটা সঞ্চয় করেন তা হ্রাস করা বা মেমরি ম্যানেজমেন্ট অ্যালগরিদম ব্যবহার করে মেমরি বিভাজনকে সীমাবদ্ধ / প্রতিরোধ করতে। এটি লক্ষ করা উচিত যে আপনি যদি একটি বৃহত প্রোগ্রাম বিকাশ না করেন যা প্রচুর পরিমাণে মেমরি ব্যবহার করে তবে এটি কোনও সমস্যা হবে না। এছাড়াও,
যেহেতু বেশিরভাগ প্রোগ্রামগুলি ওএস থেকে মেমরি ওয়ার্ক করার অনুরোধ করে এবং কোনও ফাইল ম্যাপিংয়ের অনুরোধ করে না, সেগুলি সিস্টেমের র্যাম এবং পৃষ্ঠা ফাইলের আকার দ্বারা সীমাবদ্ধ থাকবে। ব্লগে নস্টার সানচেজ (নস্টর সানচেজ) -র মন্তব্যে যেমন উল্লেখ করা হয়েছে, সি # এর মতো পরিচালিত কোড সহ আপনি র্যাম / পৃষ্ঠার ফাইল সীমাবদ্ধতা এবং অপারেটিং সিস্টেমের ঠিকানার জায়গাতে আটকে আছেন।
এটি তখন দীর্ঘ প্রত্যাশিত ছিল। আশা করি এটি কাউকে সাহায্য করবে। আমি এটি পোস্ট করেছি কারণ আমার System.OutOfMemoryException
সিস্টেমে 2 জিবি স্টাফ থাকা সত্ত্বেও আমি 24 জিবি র্যাম সহ একটি সিস্টেমে একটি এক্স 6464 প্রোগ্রাম চালাচ্ছি।