PDA

View Full Version : سوال: مشکل حافظه c++ به هنگام استفاده از تعداد زیادی آرایه ی سه بعدی



Reza_eric
یک شنبه 26 بهمن 1393, 14:01 عصر
با عرض سلام

در ++ borland c ،
در یک برنامه تعداد بسیار زیادی آرایه تعریف کرده ام که هر کدام از آنها تعداد زیادی داده را باید ذخیره و در ادامه ی برنامه بازیابی شوند .

نمونه :
float(*N)[10000][500]
int main(){
N = new float[1000][10000][500];

تقریبا در حدود 40 یا 50 پارامتر به این شکل تعریف شده اند . وقتی تعداد داده ها را کم تعیین می کنم یعنی به فرض مثال به شکل زیر


float(*N)[10000][50]
int main(){
N = new float[100][10000][50];

برنامه بدون هیچ مشکلی اجرا می شود و خروجی لازم را دریافت می کنم . اما من نیاز به داده های بیشتری دارم و با بالا بردن اعداد دچار مشکل می شوم و برنامه اجرا نمی شود .

rahnema1
یک شنبه 26 بهمن 1393, 22:28 عصر
سلام
اگه تعداد قابل توجهی از خانه های آرایه شامل صفر هست میتونید از ماتریس خلوت sparse استفاده کنید
در غیر این صورت شاید لازم باشه داده ها را روی هارد ذخیره و در صورت لزوم بخشهایی از آن را بخوانید و به تدریج پردازش کنید

developing
سه شنبه 28 بهمن 1393, 09:56 صبح
با سلام

این طور که از برنامه ی شما معلومه، برنامه شما دارای داده های حجیم هست:
تعداد خانه های آرایه دوبعدی(خط اول) => 10,000*50 یعنی 500,000 خانه
تعداد خانه های آرایه سه بعدی(خط سوم از کد اول) => 500*10,000*1,000 یعنی 5,000,000,000 خانه (یعنی 5 میلیارد)
تعداد خانه های آرایه سه بعدی(خط سوم از کد دوم) => 50*10,000*100 یعنی 50,000,000 خانه
و همانطور که می دانید هر متغیر اعشاری (float) حداقل 4 بایت اشغال می کند.

در نتیجه:
آرایه ای که در نهایت تولید خواهد شد به اندازه ی زیر گنجایش نیاز دارد: (به بایت)
در مورد اول : 500,000*4 یعنی 2,000,000 بایت
و در مورد دوم: 5,000,000,000*4 یعنی 20,000,000,000 بایت
و در مورد سوم: 50,000,000*4 یعنی 200,000,000 بایت


با تاملی در مورد اشاره گرها در زبان C/CPP در می یابیم که اشاره گرها در سیستم عامل های 32 بیتی، 4 بایتی هستند یعنی فقط می توانند تا 4,294,967,295 (یعنی کمی بیش از 4 میلیارد) بایت از آدرس حافظه را ردیابی نمایند.
حال اولین مورد و سومین مورد در ++C بدون مشکل خواهند بود .
ولی مورد دوم به علت کلانتر بودن از مقدار فهم اشاره گرها (4 میلیارد) قابل اجرا نخواهد بود.

در پایان دو راه وجود دارد:
1- استفاده از روش های گفته شده در ساختمان داده که همان بزرگداده ها (Big Data) هستند.
2- کم کردن خواسته های خود از اشاره گرها در CPP در حد معقول و فهم کامپایلر.