PDA

View Full Version : سوال: چگونه میتوانم یک آرایه با سایز بی نهایت داشته باشم؟



Argonod
شنبه 21 اسفند 1389, 18:45 عصر
سلام
تا زمانی که با فایلهای کوچک کار میکنم مشکلی نیست اما در هنگام انتخاب فایلهای حجیم مانند فیلم و استخراج بایت از آن، آرایه جوابگو نیست و با این خطا مواجه میشوم:
Exception of type 'System.OutOfMemoryException' was thrown.
آیا راهی هست که بتوانم بایت های فایلهای حجیم را نیز در آرایه قرار دهم؟

پیشاپیش سپاس

exlord
شنبه 21 اسفند 1389, 19:00 عصر
FileStream برا این موقع ها ساخته شده که مموری کم نیاری ...

mahdi_khaleghi
شنبه 21 اسفند 1389, 19:04 عصر
میتونی از لیست به جای آرایه استفاده کنی شکل کلیش این جوریه

List<type> listname= new List<type>();

یه مثال

List<string> s = new List<string>();

Argonod
یک شنبه 22 اسفند 1389, 00:29 صبح
FileStream برا این موقع ها ساخته شده که مموری کم نیاری ...
دوست گرامی فکر کنم متوجه منظور من نشدید
بنده فایل رو با فایل استریم خوندم و فقط موقعی که میخوام بایتها رو به یک آرایه از نوع int انتقال بدم مموری کم میارم

Salar Ashgi
یک شنبه 22 اسفند 1389, 00:34 صبح
سوالتان کمی گنگ هست ، با این حال کالکشن های جنریک را هم امتحان کنید ./


List<int> list = new list<int>();


موفق باشید ./

Argonod
یک شنبه 22 اسفند 1389, 00:43 صبح
سوالتان کمی گنگ هست ، با این حال کالکشن های جنریک را هم امتحان کنید .

سعی میکنم خیلی ساده توضیح بدم
فرض کنید یک فایل از نوع avi دارم که میخوام تمامی بایتهای آن را در یک آرایه از نوع Integer قرار بدم اما مموری کم میاره و میگه آرایه نمیتونه این مقدار از سایز آرایه را قبول کنه
در مورد لیست هم که دوست دیگرمون زحمت کشیدند و ذکر کردند فکر کنم مشکل دسترسی به یک خانه ی مشخص از list وجود داره یا من اشتباه میکنم
مثلا همانطور که در array[i] میتونیم به یک نقطه مشخص دسترسی داشته باشیم آیا در List هم میشود همین دسترسی وجود داشته باشد؟

ممنون از شما

Reza_Yarahmadi
یک شنبه 22 اسفند 1389, 10:01 صبح
جنریک لیست ها هم همون محدودیت آرایه رو دارند (بدلیل اینکه ایندکس گذاری هم آرایه و هم جنریک لیست بصورت 4 بایتی است)
دوست عزیز روشی که شما پیش گرفتید روش جالبی نیست ، فرض کنید فایل شما 700 مگ حجمشه ، یعنی شما میخواید برنامه شما بیش از 700 مگ RAM اشغال کنه؟ تا الان نرم افزاری دیدید که برای همچین کارهایی این مقدار RAM به خودش اختصاص بده؟
فکر نمیکنم توی برنامه نیاز باشه بصورت همزمان کل فایل رو پردازش کنید!! هر زمان به هر جایی از فایل که نیاز داشتید FileStream رو به اونجا Seek کنید و بخش کوچیکی از فایل (مثلا 1 مگ) رو بخونید و پردازش مورد نظرتون رو روش انجام بدید. برنامه های پخش کننده، مبدل ، ویرایشگر و ... فیلم و صوت هم بصورت بخش بخش فایل رو میخونند.

Argonod
یک شنبه 22 اسفند 1389, 11:38 صبح
ممنون جناب رضا
و اما یک سوال مثلا Compressor ها که عملیاتی وسیع بر روی یک فایل انجام میدهند نیز فقط بخشی از فایل را در هر لحظه مد نظر قرار میدهند؟ یا برای تست شرط و یافتن کلید ارور، یکبار بطور کلی فایل را بایت به بایت مورد تحقیق قرار میدهند؟

Reza_Yarahmadi
یک شنبه 22 اسفند 1389, 18:07 عصر
و اما یک سوال مثلا Compressor ها که عملیاتی وسیع بر روی یک فایل انجام میدهند نیز فقط بخشی از فایل را در هر لحظه مد نظر قرار میدهند؟ یا برای تست شرط و یافتن کلید ارور، یکبار بطور کلی فایل را بایت به بایت مورد تحقیق قرار میدهند؟
فرقی نمیکنه از کدوم یک از روشهایی که میگید این کار رو انجام بدن ، به هر حال همه فایل خونده نمیشه بلکه تیکه تیکه اونو میخونند و پردازش لازم رو روی فایل انجام میدند. (به این نکته توجه داشته باشید که هر مقدار فایلی که درون آرایه ریخته بشه ، حافظه از RAM اشغال میکنه). برای تست یک فایل حجیم رو با نرم افزار های فشرده ساز فشرده کنید ، حین فشرده سازی نگاه کنید و ببینید چقدر حافظه به خودش اختصاص داده.

Argonod
یک شنبه 22 اسفند 1389, 18:55 عصر
ممنون از شما بابت دنبال نمودن تاپیک
به هرحال طبق گفته شما که فایل رو تکه تکه مورد پردازش قرار دهم اقدام نمودم. اما پروسه بسیار طولانی است شاید ده ها برابر با زمانی که یک فشرده ساز زمان میبرد.
در حالی که کد من بسیار ساده است و فقط از 2 حلقه تشکیل شده باز نمیدونم اشکال کار کجاست و اینکه آیا این امکان وجود دارد که در زبان برنامه نویسی دیگری در این مدت زمان مصرفی، بهبود حاصل شود یا خیر؟
علی الیحال دارم سعی میکنم تا جایی که امکان داره از متغیرهایی که حافظه را مشغول نگه میدارند کم کنم تا شاید بهبود نسبی حاصل بشه.

با تشکر فراوان از شما جناب رضا و مابقی دوستان

Reza_Yarahmadi
یک شنبه 22 اسفند 1389, 21:55 عصر
به هرحال طبق گفته شما که فایل رو تکه تکه مورد پردازش قرار دهم اقدام نمودم. اما پروسه بسیار طولانی است شاید ده ها برابر با زمانی که یک فشرده ساز زمان میبرد.
در حالی که کد من بسیار ساده است و فقط از 2 حلقه تشکیل شده باز نمیدونم اشکال کار کجاست و اینکه آیا این امکان وجود دارد که در زبان برنامه نویسی دیگری در این مدت زمان مصرفی، بهبود حاصل شود یا خیر؟
علی الیحال دارم سعی میکنم تا جایی که امکان داره از متغیرهایی که حافظه را مشغول نگه میدارند کم کنم تا شاید بهبود نسبی حاصل بشه.
کند شدن پروسه شما خیلی به بخش بخش خوندن فایل ربط نداره ، به الگوریتم مورد استفاده شما ربط داره. مثلا اگر حلقه شما تودرتو باشه بالطبع زمان اجرایی بالایی داره. درکل با بهبود الگوریتم مشکلتون تاحدودی برطرف میشه.
در مورد زبانهای دیگه هم باید گفت: زیان #C بدلیل تمام شی گرا بودن و چند مرحله ای بودن اجرای برنامه های این زبان ، سرعت اجرایی پایینی دارند. این زبان برای برنامه هایی که پردازش بالایی دارند مورد استفاده قرار نمیگیره و بیشتر برای برنامه های تجاری و اتوماسیون های اداری مورد استفاده قرار میگیره. برای برنامه های با پردازش بالا بهترین گزینه ++C میتونه باشه. سرعت اجرایی این زبان نسبت به #C اصلا قابل قیاس نیست.

Hossenbor
یک شنبه 22 اسفند 1389, 21:55 عصر
سلام اگر برای فشرده سازی میخواهید باید از زبان سی پلاس پلاس استفاده کنید که سرعت ان ٥٠ درصد از سی شارپ یا بیشتر از این مقدار میباشد شما الگوریتمتو بگو ببینم چیه شاید بتونم کمکت کنم