PDA

View Full Version : سوال: استفاده از حافظه زیاد



hossein-khoshseyar
چهارشنبه 04 شهریور 1388, 10:21 صبح
دوستان توی وی بی دات نت حداکثر متغییرهایی که می تونی توی یک برنامه تعریف کنی.(حد اقل تو کامپیوتری که من الان دارم روش کار می کنم ) 800 مگ
حالا من دارم برنامه ای می نویسم که نیاز دارم این عدد رو بیشتر کنم . سیستمش هم موجود . من می خواهد متغیری حدد 1.5 گیگ تو برنامم تعرف کنم ولی برنامه قبول نمی کنه . کسی راح حلی راجع به این قضیه داره؟
ممنون

Mani_rf
چهارشنبه 04 شهریور 1388, 11:01 صبح
دوست عزیز بازی The Sims 3 که تازه اومده وقتی لود میشه 500 مگ فضا میگیره :متعجب:!!! مگر داری چیکار می کنی؟؟؟

حالا در هر صورت برای استفاده این چنین از حافضه به دلیل اینکه حافظه ای با آدرس های پشت هم را اشغال می کند از متغیر و آرایه استفاده نمی شود ، برای انجام چنین کاری شما باید از لیست های پیوندی استفاده نمایید.

hossein-khoshseyar
چهارشنبه 04 شهریور 1388, 13:14 عصر
دوست عزیز بازی The Sims 3 که تازه اومده وقتی لود میشه 500 مگ فضا میگیره :متعجب:!!! مگر داری چیکار می کنی؟؟؟

حالا در هر صورت برای استفاده این چنین از حافضه به دلیل اینکه حافظه ای با آدرس های پشت هم را اشغال می کند از متغیر و آرایه استفاده نمی شود ، برای انجام چنین کاری شما باید از لیست های پیوندی استفاده نمایید.

دوست عزیز متاسفانه من نمی تونم بگم دقیقا دارم چیکار ی کنم فقط بگم یه برنامه پردازشی خیلی سنگین که از یه cpu هست هسته ای دارم استفاه می کنم و دوتا کامپیوتر از این نوع با هم شبکن و دارن یه حجم عظیمی از دیتا ها رو پردازش می کنن.
حجم دیتا هم خیلی بالاتر از ایناست و مرتب دارن روی یه هارد سریع نوشته می شن.
در هر خال من به همچشن چیزی که گفتم احتیاج دارم . اگه می شه بیشتر راهنماییم کنید. لیست پیوندی چیخ و چه طوری میشه ازش استفاده کرد؟
راستی یه سئوال دیگه . چه طوری می شه توی ویندوز xp رم بیشتر از 3 گیگ رو بهش شناسوند . من 6 گیگ رم روی سیستم دارم که 3 گیگش رو بیشتر نمیشناسه
ممنون

Mani_rf
چهارشنبه 04 شهریور 1388, 13:42 عصر
لیست های پیوندی حافظه مورد نیاز را از هرکجای رم که آزاد باشد اختیار می کنند و مانند آرایه آدرسهای پشت هم را اختیار نمی کنند . کارکردن با آنها دشوار است اما بهترین راه برای میزان حافظه زیاد است. این را هم بگم که لیست پیوندی به نام جهنم برنامه نویسی مشهور است.

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



اما درباره Ram در XP :

من به XP تا 4 گیگ را شناساندم اما بیشتر از آن را باید از Vista و 7 (Seven) انتظار داشته باشید.

hossein-khoshseyar
چهارشنبه 04 شهریور 1388, 14:29 عصر
دوست عزیز من 3 تا رم 2 گیگ رو سیستم دارم که متاسفانه هر کاری می کنم نمی تونم همون 4 گیگ شمار رو به سیستم معرفی کنم
از win vista هم نمی خوام استفاه کنم
راهی نداره که بشه این کار رو کرد یا شما بلد نیستید؟

pirmard
چهارشنبه 04 شهریور 1388, 14:30 عصر
لیست های پیوندی حافظه مورد نیاز را از هرکجای رم که آزاد باشد اختیار می کنند و مانند آرایه آدرسهای پشت هم را اختیار نمی کنند . کارکردن با آنها دشوار است اما بهترین راه برای میزان حافظه زیاد است. این را هم بگم که لیست پیوندی به نام جهنم برنامه نویسی مشهور است.



علاوه بر تفاوتی که این دوستمون در مورد فرق آرایه با لیست پیوندی ذکر کردن ، مزایای دیگه هم داره مثلا امکان تعریف عناصر جدید به صورت ران تایم ، توانایی آزادسازی عناصر ایجاد شده حتی در عناصر میانی (unalloc) مثلا شما می خاین عنصر شماره 2 رو کلن حذف کنین و یا حتی می خاین بین عنصر شماره 5 و 6 یه عنصر جدید ایجاد کنین و ... .

اگر می خاید توی محیط ویژوال بیسیک یا سی شارپ استفاده کنید هم جای نگرانی نداره . لازم نیست مثل دوران دانشگاه (که دوستمون اشاره کردن) خونه های حافظه رو دستی ایجاد و آدرسدهی کنین . خود vs امکان تعریف لیست پیوندی رو در اختیار می زاره :
dim ls as linkedlist (of type/struct)

Mani_rf
چهارشنبه 04 شهریور 1388, 14:32 عصر
من با SP2 ویندور تست کردم. راهی که به ذهنم رسید اینه که SP3 ویندوز XP را از سایت مایکروسافت دانلود کن و نصب کن ، شاید مشکلت تو اون حل شده باشه.

hossein-khoshseyar
چهارشنبه 04 شهریور 1388, 14:41 عصر
علاوه بر تفاوتی که این دوستمون در مورد فرق آرایه با لیست پیوندی ذکر کردن ، مزایای دیگه هم داره مثلا امکان تعریف عناصر جدید به صورت ران تایم ، توانایی آزادسازی عناصر ایجاد شده حتی در عناصر میانی (unalloc) مثلا شما می خاین عنصر شماره 2 رو کلن حذف کنین و یا حتی می خاین بین عنصر شماره 5 و 6 یه عنصر جدید ایجاد کنین و ... .

اگر می خاید توی محیط ویژوال بیسیک یا سی شارپ استفاده کنید هم جای نگرانی نداره . لازم نیست مثل دوران دانشگاه (که دوستمون اشاره کردن) خونه های حافظه رو دستی ایجاد و آدرسدهی کنین . خود vs امکان تعریف لیست پیوندی رو در اختیار می زاره :
dim ls as linkedlist (of type/struct)
ای بابا همه شما مثل اینکه رشته دانشگاهیتون نرم افزار بود فقط من این وسط مثل اینکه نرم افزاری نیستم :چشمک::چشمک::چشمک:
دوست عزیز ممنون از پاسخت
میشه با یه مثال چند خطی نحوه تعریف و استفاه از اون رو به ما یاد بدی

pirmard
چهارشنبه 04 شهریور 1388, 17:19 عصر
ای بابا همه شما مثل اینکه رشته دانشگاهیتون نرم افزار بود فقط من این وسط مثل اینکه نرم افزاری نیستم :چشمک::چشمک::چشمک:
دوست عزیز ممنون از پاسخت
میشه با یه مثال چند خطی نحوه تعریف و استفاه از اون رو به ما یاد بدی

از معایب لیست پیوندی نگفتم چرا ؟ ! :لبخند:
یه عیبی که داره اینه که دسترسی تصادفی توش مقدور نیست . یعنی شما مثل آرایه نمیتونی یهو بپری روی خونه ی 50 ام . باید از اول شروع کنی به پیمایش (اگه دوپیوندی باشه (و احیانا حلقوی)می تونی از آخر هم بری)
البته واقعا نمی دونم برای سرعت بخشیدن به این مور (حداقل در سطح کدنویسی) محیط vs چه امتیاری رو قرار داده .

مثال :
http://forums.devx.com/showthread.php?t=141706
http://www.c-sharpcorner.com/UploadFile/jeradus/UsingLinkedListInCS11102005005525AM/UsingLinkedListInCS.aspx


//
شاید اگه شما اهدافتون رو از این کار بگین بشه راهکارهای بهتری ارایه داد .

hossein-khoshseyar
چهارشنبه 04 شهریور 1388, 21:39 عصر
د وست عزیز فعلا فرصت نکردم که لینک هایی رو که گذاشتی ببینم اما ممنون
ببین من یه سخت افزار خفن خیلی سریع دارم که به pci وصل می شه و داره از یه چیزی به من دیتا می ده و من باید تقریبا در هر ثانیه 90 مگا بایت دیتا از اون بگیرم و در همون موقع روش پردازش خاصی انجام بدم. الگوریتمی که دارم نیازمند این که ما چند تا آرایه دیگه اندازه اون داشته باشیم و این خودش حدود یک گیگ رم احتیحاج داره اتفاقا توش نیاز دارم که مثل آرایه به مقادیر وسطش به طور تصادفی هم دسترسی داشته باشم . تا الا ن که حجم داه هام رو کوچیک می گرفتم و سرجمع 500 مگ رم می خواست مشکلی نبود اما امروز اومدم کاملش کنم که دیدم دات نت به متغیرهایی که بیش از 800 مگ جا بخواد گیر می ده

pirmard
پنج شنبه 05 شهریور 1388, 00:22 صبح
من باید تقریبا در هر ثانیه 90 مگا بایت دیتا از اون بگیرم و در همون موقع روش پردازش خاصی انجام بدم. الگوریتمی که دارم نیازمند این که ما چند تا آرایه دیگه اندازه اون داشته باشیم

مثلا الان یه آرایه دارین با حجم 500 مگ ؟ این آرایه از چه نوع و با چه تعداد عنصر تعریف میشه ؟

vcldeveloper
پنج شنبه 05 شهریور 1388, 02:17 صبح
دوست عزیز من 3 تا رم 2 گیگ رو سیستم دارم که متاسفانه هر کاری می کنم نمی تونم همون 4 گیگ شمار رو به سیستم معرفی کنم
از win vista هم نمی خوام استفاه کنم
راهی نداره که بشه این کار رو کرد یا شما بلد نیستید؟
برای استفاده از بیش از 4 گیگ RAM یا باید از یک سیستم عامل 64 بیتی استفاده کنید، یا از سیستم عامل 32 بیتی که PAE را پشتیبانی کند. برای مورد شما: Windows XP 64-bit.


حالا در هر صورت برای استفاده این چنین از حافضه به دلیل اینکه حافظه ای با آدرس های پشت هم را اشغال می کند از متغیر و آرایه استفاده نمی شود ، برای انجام چنین کاری شما باید از لیست های پیوندی استفاده نمایید.
این ربطی به مصرف زیاد حافظه نداره، چون اصلا برنامه شما دسترسی مستقیم به RAM نداره که بخواد حالا چند خانه پشت سر هم یا چند خانه در نقاط مختلف RAM را به دلخواه خودش استفاده کنه! برنامه شما فقط به فضای آدرس مجازی که ویندوز در اختیارش قرار میده دسترسی داره. هر Process بطور عادی 4 گیگابایت فضای مجازی میتونه داشته باشه که از این مقدار، 2 گیگابایتش مربوط به کدهای سطح کرنل هست و برنامه دات نت شما کاری به اون نداره، 2 گیگابایت در اختیار برنامه دات نت شما قرار میگیره. اینکه ویندوز این مقدار حافظه را به شکلی تامین میکنه، به برنامه شما ربطی نداره، ممکن هست ویندوز بخشی از آن را با Map کردن فایل های روی هارد دیسک تامین کنه، بخشی رو از Page File تامین کنه، بخشی رو هم از RAM تامین کنه. مهم این هست که وقتی برنامه ایی نیاز به حافظه داره، ویندوز بتونه این حافظه را براش تامین کنه.

وقتی شما یک آرایه تعریف می کنید، این آرایه در فضای Heap مربوط به Process شما ایجاد میشه. اینکه این فضا به کدام خانه های حافظه اصلی Map میشه، به برنامه شما مربوط نمیشه.


دوست عزیز متاسفانه من نمی تونم بگم دقیقا دارم چیکار ی کنم فقط بگم یه برنامه پردازشی خیلی سنگین که از یه cpu هست هسته ای دارم استفاه می کنم و دوتا کامپیوتر از این نوع با هم شبکن و دارن یه حجم عظیمی از دیتا ها رو پردازش می کنن.
شما که قرار هست روی یک پروژه با حجم پردازش بالا کار کنید، باید حداقل یک دانش اولیه از انواع ساختمان داده، چگونگی مدیریت حافظه، و چگونگی مدیریت Thread ها، و تقسیم بار پردازش بین آنها، داشته باشید، وگرنه اگر یک ابر کامپیوتر هم به شما بدهند، شما Resource کم میاورید، و تقاضای سخت افزار قوی تر می کنید!

hossein-khoshseyar
پنج شنبه 05 شهریور 1388, 09:14 صبح
از سیستم عامل 32 بیتی که PAE را پشتیبانی کند.

دوست عزیز PAE چیه و چه سیستم عاملی اون ر. پشتیبانی می کنه ؟



2 گیگابایت در اختیار برنامه دات نت شما قرار میگیره. اینکه ویندوز این مقدار حافظه را به شکلی تامین میکنه، به برنامه شما ربطی نداره،

پس چه طور می شه از این 2 گیگی که شما میگید در اختیار دات نت هست استفاه کرد.
وقتی چندتا آرایه بزرگ تعریف می کنیم به محض اینکه حجمشون از 800 مگ رفت بالا برنامه خطای out of meory می ده




شما که قرار هست روی یک پروژه با حجم پردازش بالا کار کنید، باید حداقل یک دانش اولیه از انواع ساختمان داده، چگونگی مدیریت حافظه، و چگونگی مدیریت Thread ها، و تقسیم بار پردازش بین آنها، داشته باشید، وگرنه اگر یک ابر کامپیوتر هم به شما بدهند، شما Resource کم میاورید، و تقاضای سخت افزار قوی تر می کنید


من تو مراحل اولیه همین پروژه با داده 15 مگ در ثانیه که در مجموع با همه آرایه هاش می شد حدود 350 مگ رم کار می کردم و هیچ مشکل الگوریتمی و پردازشی نداشتم و با Thread آشنا هستم و تو الگوریتمم از استفاد هم می کنم.الان که می خوام برنامه رو نهایی کنم تنها مشکلم میزان حافظه ست که کم می یارم و نمی تونم بیش از 800 مگ از سیستم حافظه بگیرم.
اگه یه توضضیحی بدبد که چه طور می شه بیش از این تز سیستم حافظه گرفت ممنون می شم.

hossein-khoshseyar
پنج شنبه 05 شهریور 1388, 09:16 صبح
مثلا الان یه آرایه دارین با حجم 500 مگ ؟ این آرایه از چه نوع و با چه تعداد عنصر تعریف میشه ؟

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

hossein-khoshseyar
شنبه 07 شهریور 1388, 07:36 صبح
کسی نیست که جواب بده ؟