PDA

View Full Version : یه مشکل با آرایه بزرگ ؟



Moharram
چهارشنبه 11 دی 1387, 07:28 صبح
سلام

من یه آرایه 1000 مگابایتی رو به عنوان یک بافر حلقوی استفاده میکنم، و با اومدن دیتا اول تو این بافر کپیش میکنم تا فرصت نوشتن تو هارد بشه...

اما وقتی آرایه تا یه حجمی مثلا 300 مگابایت پر میشه، Error حافظه ای میده... انگار که آرایه هنوز Allocate نشده باشه... در حالیکه آرایه کاملا استاتیکه...

یه چیز دیگه هم اینکه این برنامه تا چند وقت پیش کار میکرد و مشکلی نداشت، و یه دفعه اینجوری شده...!
در ضمن تو یه سیستم دیگه مشکل ندارم...

آیا اشکال میتونه سخت افزاری باشه... از RAM ، MotherBoard یا چیزه دیگه

مثال زیر تقریبا اون چیزیه که اتفاق می افته...



#define HugeArraySize 1000*1024*1024
#define tempSize 10*1024*1024

DWORD HugeArray[HugeArraySize/4];
DWORD temp[tempSize/4];

DWORD i=0,j=0;

for(i=0;i<tempSize/4;i++)
temp[i]=i;

for(i=0;i<100;i++)
{
memcpy((DWORD*)(HugeArray+j),(DWORD*)temp,tempSize );
j += tempSize/4;
}


همونطور که معلومه یک آرایه 10 مگابایتی رو تو یک آرایه 1000 مگابایتی کپی میکنیم و جلو میریم...
ولی این کد در سیستم مشکل دار فقط 5، 6 بار میتونه 10 مگابایت کپی کنه ولی تو یه سیستم دیگه درست کار میکنه...

این رو اضافه کنم که RAM سیستمها به اندازه کافی بزرگه ...

با تشکر

Nima_NF
چهارشنبه 11 دی 1387, 21:12 عصر
هرگز برای تخصیص حافظه های بزرگی به این میزان از آرایه ها استفاده نکنید، از تخصیص آرایه های پویا استفاده کنید.
برای این میزان اندازه آرایه، stack را در کامپایلر تغییر دادید؟

Moharram
شنبه 14 دی 1387, 07:29 صبح
هرگز برای تخصیص حافظه های بزرگی به این میزان از آرایه ها استفاده نکنید، از تخصیص آرایه های پویا استفاده کنید.


پس چرا در یه سیستم دیگه اشکال نمیگیره ...



برای این میزان اندازه آرایه، stack را در کامپایلر تغییر دادید؟

نه... اندازه Stack رو تغییر ندادم ...

C++Lover
سه شنبه 17 دی 1387, 02:47 صبح
کدی که شما نوشتید مطمئنا مشکل Stack Overflow داره. مطمئنا برنامه که اجرا کردید این نیست مگر اینکه اندازه Reserved Stack رو توی Link Option و یا به کمک سوئیچ STACK لینکر تغییر داده باشید و یا اینکه Optimizer کاری کرده باشه که برنامه اجرا بشه ولی در بعضی موارد و بسته به مشخصات سخت افزاری و نرم افزاری سیستم مشکل پیش میاد.

همان طوری که نیما جان هم گفتند بهتر است از تخصیص پویا استفاده کنید.

من تجربه ای در این ضمینه ندارم اما فکر میکنم برای اختصاص حافظه به این بزرگی استفاده از Heap هم کار درستی نیست و بهترین راهش فکر کنم استفاده از Memory Map File ها باشه.