PDA

View Full Version : سوال: خطا در هنگام ساخت آرایه



alireza_tavakol
سه شنبه 10 شهریور 1388, 02:03 صبح
با سلام

من امروز با اتفاق جالبی بر خورد کردم و چند تا جواب به ذهنم رسید ولی هیچ کدوم از جواب ها پایه منطقی نداشت واسه همین گفتم سوال رو اینجا مطرح کنم تا شاید به جواب قانع کننده ای برسم

من می خواهم آرایه زیر رو ایجاد کنم با خطا مواجه شدم

int[] b = new int[144702452];

متن خطاException of type 'System.OutOfMemoryException' was thrown.

حالا اگه آرایه رو به صورت زیر تعریف کنم با خطا مواجه نمیشم

int[] b = new int[144702451];
به نظر شما چرا این خطا به من داده میشه؟:متفکر:

Amir Oveisi
سه شنبه 10 شهریور 1388, 02:39 صبح
میزان RAM کامپیوترتون چقدره؟

alireza_tavakol
سه شنبه 10 شهریور 1388, 02:46 صبح
میزان RAM کامپیوترتون چقدره؟

دو تا RAM دارم که هر کدوم 512 MB ظرفیت داره => 2*512 مساوی GB1
میزان حافظه مجازی سیستم عامل رو هم به صورت پیش فرضه و مقدار 1536-3072 MB ظرفیت داره

البته فکر نمکنم این خطا ربطی به میزان RAM یا Virtual memory داشته باشه

لطفا" شما هم رو سیستمتون این قضیه رو تست کنید تا به نتیجه گیری دقیق تری برسیم:لبخندساده:

Amir Oveisi
سه شنبه 10 شهریور 1388, 03:27 صبح
چرا اتفاقا با توجه به مطالبی که تو لینک زیر و چند جای دیگه دیدم به محدودیت های حافظه ای مربوط میشه و بصورت تئوری در دات نت برای طول آرایه ها محدودیتی در نظر گرفته نشده و میتونن حتی طولی معادل با یک عدد long رو داشته باشن (بصورت بالقوه این قابلیت رو داره دات نت).
یک دلیل این میوتنه باشه که دات نت برای رزرو کردن حافظه برای آرایه ها، یک block حافظه را که بصورت فیزیکی پشت سر هم باشند رو در نظر میگیره و اگر این مقدار مورد نظر در حافظه پیدا نشه این Exception رو میده.

اطلاعات بیشتر:
http://social.msdn.microsoft.com/Forums/en-US/csharplanguage/thread/57d73f0d-e72d-4d27-88b8-3c681782c1cf
http://bytes.com/topic/c-sharp/answers/267551-memory-limit

موفق باشید

alireza_tavakol
سه شنبه 10 شهریور 1388, 03:45 صبح
به محدودیت های حافظه ای مربوط میشه

اگه فرض رو بر محدود بودن حافظه بگذاریم پس بعد از تعریف آرایه
int[] b = new int[144702451];
که خطا به من نمی ده حافظه من پر و نباید بتونم حتی یک متغییر دیگه تعریف کنم . در صورتی که من وقتی آرایه بالا رو تعریف میکنم ، می تونم بازم متغییر تعریف کنم ولی کافی یک عنصر بیشتر از مقدار بالا واسه آرایه new کنم تا Error بهم بده!


دات نت برای رزرو کردن حافظه برای آرایه ها، یک block حافظه را که بصورت فیزیکی پشت سر هم باشند
اگه فرض رو بر صحت جمله بالا بگذاریم پس باید در هر باری که کامپیوتر من روشن و خاموش میشه و یا نسبت به برنامه های مختلفی که روی سیستم من بازه عدد متفاوتی واسه عناصر آرایه داشته باشم در صورتی که این چنین نیست و من در موقعیت های مختلف این مسئله رو تست کردم تازه اگه صحت این جمله محرض بشه عدم پایداری برنامه به اثبات میرسه!

Amir Oveisi
سه شنبه 10 شهریور 1388, 03:54 صبح
حافظه من پر و نباید بتونم حتی یک متغییر دیگه تعریف کنم . در صورتی که من وقتی آرایه بالا رو تعریف میکنم ، می تونم بازم متغییر تعریف کنم
منظور از پر بودن حافظه این نیست که حافظه عیچ فضای خالی ندارد بلکه منظور اینه که فضای خالی یکپارچه به اون اندازه ای که خواستیم نداره و متغیر های جدید در مکان های دیگر حافظه ایجاد میشن و هیچ مشکلی هم نخواهند داشت.


اگه فرض رو بر صحت جمله بالا بگذاریم پس باید در هر باری که کامپیوتر من روشن و خاموش میشه و یا نسبت به برنامه های مختلفی که روی سیستم من بازه عدد متفاوتی واسه عناصر آرایه داشته باشم در صورتی که این چنین نیست و من در موقعیت های مختلف این مسئله رو تست کردم تازه اگه صحت این جمله محرض بشه عدم پایداری برنامه به اثبات میرسه!

لینک اولی رو که دادم با دقت بخونید.

mostafa_shaeri_tj
یک شنبه 07 شهریور 1389, 01:46 صبح
تعریف آرایه :

تعدادی عنصر هم نوع و هم اندازه که با یک نام مشترک به صورت متوالی در خانه های حافظه ذخیره می شوند .

پس ممکنه حافظه هنوز جا داشته باشه، اما به صورت تیکه تیکه و نه یک جا و متوالی. در این صورت با خطای کمبود حافظه مواجه میشیم.

amirh_karimifar
یک شنبه 07 شهریور 1389, 04:53 صبح
این خطا دقیقا باه خاطر کمبود حافظه اصلیه . اونم فقط در آرایه ها پیش میاد که محکوم به همسایگیند .
اگه شما دو تا آرایه با نصف این مقدار داشته باشید میبینید که مشکلی پیش نخواهد اومد .
یک راه خوب برای اثبات این حرفام گجت cpu meter در سون و ویساست که وقتی برنامه رو run کردین و این خطا رو دواد میبینید که در صد رمش بالای 95 رفته .

ASKaffash
یک شنبه 07 شهریور 1389, 09:11 صبح
با سلام

من امروز با اتفاق جالبی بر خورد کردم و چند تا جواب به ذهنم رسید ولی هیچ کدوم از جواب ها پایه منطقی نداشت واسه همین گفتم سوال رو اینجا مطرح کنم تا شاید به جواب قانع کننده ای برسم

من می خواهم آرایه زیر رو ایجاد کنم با خطا مواجه شدم

int[] b = new int[144702452];

متن خطاException of type 'System.OutOfMemoryException' was thrown.

حالا اگه آرایه رو به صورت زیر تعریف کنم با خطا مواجه نمیشم

int[] b = new int[144702451];
به نظر شما چرا این خطا به من داده میشه؟:متفکر:
سلام
روی PC من این دستور هیچ خطائی نمی ده :


int[] b = new int[144702452]