التعامل مع الملفات الكبيره - سي شارب - مقـــالات - Top Coder
Welcome to our Site
الدخــول Or تسجـــيل
الأحد
2016-12-04
11:22 PM
تسجــــيل | دخـــول
الرئيسية » مقالات » سي شارب

التعامل مع الملفات الكبيره
التعامل مع الملفات الكبيره

مقـــدمــه
ما هي الطريقه التي تقرأ بها الملفات في برنامجك , هل تستخدم الداله Read ؟ , اذاً فلابد من انك واجهت مشكلة التعامل مع الملفات الكبيرة الحجم , فقط اذا استخدمت الداله بطريقه اخرى فستجد انه لامشكله , وهذا ما سنوضحه في السطور القليله القادمه .
المشكله
المشكله تكمن في حجم الذاكره العشوائيه (RAM) في الكمبيوتر الذي يعمل عليه برنامجك , فقراءة ملف معين في البرنامج للتعامل مع تلك البيانات عن طريقه الداله Read , فلابد ان البرنامج يحمل تلك البيانات داخل الذاكره , فإذا كان حجم الملف صغير او على اقل تقدير اقل من المساحه المتاحه على الذاكره , فهنا لا مشكله كبيره , فبرنامجك سيعمل ولكنه سيشغل مساحه كبيره على الذاكره حسب حجم الملف , واقصى ما يمكن ان يحدث هو بطئ نسبي في عمل البرنامج , اما اذا كان حجم الملف اكبر من حجم الذاكره المتاحه فسوف لن يعمل البرنامج , وستظهر لك بكل تأكيد الخطأ المشهور
The file is too long. This operation is currently limited to supporting files less than 2 gigabytes in size
وذلك حسب حجم الذاكره المتاحه في الحاسب الذي يعمل عليه .
ففي الحالتين سواء الذاكره كافيه او لا فانت لا توفر الاستخدام الجيد للموارد المتاحه , فحتى لو كان حجم الملف اصغر من الذاكره , فانت استنفذت مكان كبير جدا بالذاكره , ناهيك عن البطئ الذي يصاحب هذه العمليه , فانت لا تستطيع ان تحدد حجم الملف او حجم الذاكره التي سيعمل عليها وانت في مرحلة التصميم , لذلك وجب ايجاد طريقه اخرى تحقق الاستخدام الافضل لموارد الحاسب , وعن الحل فهو سهل جداً واعتقد ان غالبية المبرمجين يعرفونه , ولكن وجب ان نوفر الشرح لمن لا يعرفه على توب كودر .
لكن اولا حاول ان تجرب الكود التالي مع العديد من الملفات , ترى اثرها على الذاكره وعلى اداء البرنامج واداء الحاسب ككل.
Wrong Code
الحل
بكمن الحل في تقسيم الملف الى اجزاء صغيره تتعامل معها كلا على حده , او بتعبير اصح هو التجول داخل الملف , فمثلاً لنقول ان لدينا ملف حجمه 1 ميجا , وهو حجم صغير يمكن التعامل معه مباشرة , ولكن اذا جعلنا البرنامج يتعامل معه كاجزاء , كأن يقرأ البرنامج 100 كيلو بايت في المره الواحده , وجري عليها العمليات التي تريدها , ثم تتركها , وتقرأ ال 100 كيلو التاليه , وهكذا حتى تنتهي من الملف كاملاً , وبالتالي نكون حققنا المعادله , فمن ناحيه قرأنا الملف واجرينا عليه العمليات التي نريدها , ومن ناحيه اخرى استخدمنا الذاكره استخدام جيد , فمهما كان حجم الملف لن يستهلك البرنامج مساحه للملف اكبر من 100 كيلو بايت , فتخيل معي ملف بحجم 3 جيجا بايت , ستجري عليه عملياتك دون ان تستهلك ذاكره له اكبر من 100 كيلو بايت , وبالتالي لن تهتم لحجم الملف ولا لحجم الذاكره وان تقوم بعملية تصميم البرنامج.
الحل برمجياً
اولا سنستخدم الكلاس FileStream الذي يندرج تحت النيم سبيس System.IO , وهذا الكلاس يتيح لك عمليات عديده على الملفات منها القراءة والكتابه وغيرها , وسيقوم هذا الكلاس بعملياته بالترتيب المنطقي التالي :
1-  سيحدد مساحة الجزء الذي سيقرأ في المرة الواحده مثلا 10 كيلو بايت (10000 بايت)
2-  يبدأ البرنامج من الجزء 0 من الملف ويقرأ الجزء الاول منه
3-  تجرى العمليات على الجزء المقروء
4-  يبنتقل البرنامج الى الجزء الذي يبدأ بعد 10000 بايت من الجزء السابق (0 + 10000)
5-  يعيد البرنامج العمليات على الجزي الجديد
6-  يعيد البرنامج الكره هكذا حتى ينتهي من الملف بأكمله
ولكي نوضح الامور اكثر سنقوم بتطبيق هذه الطريقه على برنامج بسيط يقوم بنسخ الملفات , واليكم الداله التاليه التي تطبق كل ما قمنا بشرحه سابقاً
Copy Files Method
 
وكما هو واضح فان الطريقه بسيطه جدا فقط قمنا بادراج كائنين FileStream احدهما reader وهو الذي يقوم بمهمة القراءة من المصدر , وهو المنوط به عملية التجول داخل الملف , والاخر writer وهو الذي يقوم بالعمليات على الجزء المقروء من الملف , وتم ادراج buffer من نوع بايت وتم تحديد حجمه 10000 اي 10 كيلو بايت وهو الذي يوضع داخله البيانات , وادرجنا متغير رقمي يحمل قيمة المكان الحالي للقارئ داخل الملف , فيقوم ال reader بقراءة جزء من الملف يبدأ من النقطه curPos وهي قيمة اعطيناها مبدأياً القيمة 0 حتى يبدأ من بداية الملف , ويضع الجزء المقروء داخل ال buffer ليبدأ ال writer بالعمل ونسخ هذا الجزء الى المكان الجديد , ثم يتم زيادة قيمة curPos بقيمة الجزء المقروء , لكي يبنتقل الreader الى الجزء الذي يليه , وهكذا حتى ينتهي البرنامج من قراءة الملف كاملاً , يتم اغلاق كلاً من reader و writer ويكون البرنامج قد انجز عمله.

يقوم البرنامج بالعمليات مهما كان حجم الملف ومهما كان حجم الذاكره , فمساحة 10 كيلو بايت لابد انها متوفره حتى في اسوأ الظروف , وفي النهايه فما قمنا بشرحه لا يعدو ان يكون شيئاً بسيطاً , فتطبيق الطريقه على برنامج لنسخ الملفات ما هو الا للتوضيح فقط , ويمكنك اذا اردت ان تنجز برنامجاً  لنسخ الملفات ان تستخدم الداله File.Copy وستقوم هي بكل ذلك بالنيابه عنك , ولكن كما قلنا هي لتوضيح الفكره ليس أكثر .
تحميل المشروع
 Written by :  Mohammed Mahmoud
الفئة: سي شارب | أضاف: ham_mody2000 (2013-04-21 0:55 AM)
مشاهده: 2284 | الترتيب: 0.0/0


أترك تعليقك من خلال حسابك على الفيس بوك

تعليقات مشتركي الموقع

مجموع المقالات: 0
إضافة تعليق يستطيع فقط المستخدمون المسجلون
[ التسجيل | دخول ]
طريقة الدخول
بحث
Our Facebook community

تم إطلاق صفحة توب كودر على الفيس بوك

Advertisment
الأحـــدث
hitstatus
Copyright Mohammed Mahmoud © 2016
إنشاء موقع مجاني с uCoz