الحد من استخدام ذاكرة الوصول العشوائي.(سي#.نت)

StackOverflow https://stackoverflow.com/questions/5056434

  •  15-11-2019
  •  | 
  •  

سؤال

هناك ملفات ضخمة حوالي 100 ميجابايت.أريد تحميلها في الذاكرة (RAM)، ومعالجتها وحفظها في مكان ما.

في نفس الوقت أريد أن يكون هناك حد لاستخدام الذاكرة.على سبيل المثال، 100 ميجابايت، لا تستخدم تطبيقي أكثر من حد الذاكرة هذا.إذا تم تجاوز الحد الأقصى تتم معالجة أجزاء الملف.

فهمي لهذا:

var line = file.ReadLine();
var allowed = true;

while( allowed && line != null ) 
{
   var newObject = new SomeObject( line );
   list.add( newObject );

   // Checking the memory
   allowed = CheckUsedMemory(); 

   line = file.ReadLine()
} 

كيفية الحد من استخدام ذاكرة الوصول العشوائي؟كيفية تنفيذ طريقة CheckUsedMemory؟شكرًا لك.

محدث

شكرا للجميع على النصائح الجيدة.

هل كانت مفيدة؟

المحلول

أولاً، شكرًا لك على علمك باستهلاك ذاكرتك.لو كان المزيد من المبرمجين يراعون ذلك ..

ثانيا لن أزعجك:ربما يريد المستخدم أن يعمل تطبيقك بأسرع ما يمكن ويكون على استعداد لحرق 8000 ميجا من الذاكرة للحصول على نتائج أسرع بنسبة 5%.دعهم.:)

لكن, ، قد يؤدي الحد بشكل مصطنع من مقدار الذاكرة التي يستهلكها تطبيقك بشكل كبير يزيد وقت المعالجة، إذا قمت بفرض المزيد من عمليات الوصول إلى القرص في هذه العملية.إذا كان شخص ما يعمل على نظام مقيد بالذاكرة، فمن المحتمل أن يكون لديه بالفعل حركة مرور على القرص للتبديل - إذا كنت تقوم بتفريغ الذاكرة بشكل مصطنع قبل الانتهاء منها حقًا، فأنت تساهم فقط في إدخال/إخراج القرص، والدخول طريقة المبادلة.دع نظام التشغيل يتعامل مع هذا الموقف.

وأخيرًا، نمط الوصول الذي كتبته هنا (متسلسل، سطرًا في كل مرة) هو جداً شائع، ومما لا شك فيه أن مصممي .NET قد بذلوا قدرًا كبيرًا من الجهد للوصول باستخدام الذاكرة من هذا النمط إلى الحد الأدنى.تعد إضافة كائنات إلى أشجارك الداخلية على أجزاء فكرة رائعة، لكن عددًا قليلًا جدًا من التطبيقات يمكنه الاستفادة من ذلك حقًا.(يعد فرز الدمج أحد التطبيقات الممتازة التي تستفيد بشكل كبير من المعالجة الجزئية.)

اعتمادًا على ما تفعله بقائمة الكائنات النهائية، قد لا تتمكن من تحسين العمل بالقائمة بأكملها مرة واحدة.أو قد تستفيد كثيرًا من تفكيكها.(لو تخفيض الخريطة يصف مشكلة معالجة البيانات لديك جيدًا، فربما تستفيد من تفكيك الأشياء.)

على أي حال، سأكون حذرًا بعض الشيء من استخدام "الذاكرة" كمعيار لتحديد موعد فصل المعالجة:أفضل استخدام "1000 سطر من الإدخال" أو "عشرة مستويات من التداخل" أو "تشغيل أدوات الآلة لمدة خمس دقائق" أو شيء يعتمد على الإدخال، بدلاً من التأثير الثانوي للذاكرة المستهلكة.

نصائح أخرى

يمكنك المحاولة مع:

long usedMemory = GC.GetTotalMemory(true);

أو

long usedMemory = GC.GetTotalMemory(false);

الأول سيجبر على جمع (تنظيف) الذاكرة المهملة، لذا فهو أبطأ (ملي ثانية)

ثم اقرأ هذا لمعرفة مقدار الذاكرة الموجودة بجهازك:

كيف يمكنك الحصول على إجمالي حجم ذاكرة الوصول العشوائي (RAM) الموجودة بالكمبيوتر؟

تذكر أنه إذا كنت تعمل كتطبيق 32 بت، فلن تتمكن من استخدام الذاكرة بأكملها، وقد تستخدم العمليات الأخرى الذاكرة!

الإجراء العادي هو عدم تحميل كل شيء في الذاكرة، بل قراءة الملف على أجزاء ومعالجته وحفظه.إذا كان عليك لسبب ما الاحتفاظ بكل شيء في ذاكرة الوصول العشوائي (على سبيل المثال للفرز)، فقد يتعين عليك الاستثمار في المزيد من ذاكرة الوصول العشوائي.

هذه مشكلة في الخوارزمية التي تستخدمها، لذا يجب أن يكون السؤال حول كيفية حل مهمة معينة دون استخدام الكثير من الذاكرة.

جي سي.GetTotalMemory() سيخبرك مقدار الذاكرة التي تستخدمها.

100 ميجابايت من ذاكرة الوصول العشوائي ليست كثيرة اليوم.ويمكن إجراء قراءتها في الذاكرة ومعالجتها وإعادتها إلى القرص بسرعة كبيرة.تذكر أنه لا يمكنك تجنب نسخه من القرص إلى الذاكرة وإعادته إلى القرص على أي حال.إن استخدام StringBuilder (وليس String) للاحتفاظ به لن يؤدي بالضرورة إلى إضافة الكثير من الحمل إلى التطبيق.من المؤكد أن كتابة 100 ميجابايت في عملية واحدة أسرع من سطر واحد في المرة الواحدة.

يبدو أنك تريد معالجة ملف سطرًا تلو الآخر، ولكن قد يكون من المفيد معرفة أنه باستخدام .NET 4، يمكنك استخدام ملفات الذاكرة المعينة, ، والذي يتيح لك الوصول إلى الملفات الكبيرة بشكل متناثر

لا يمكنك حقًا تحديد استخدام الذاكرة.يمكنك فقط تحديد مقدار الذاكرة التي تحتفظ بها.ما إذا كان سيتم تحرير بقية الذاكرة أم لا هو أمر متروك لجامع البيانات المهملة.

لذا أقترح عليك أن تهتم فقط بعدد الأسطر (أو يفضل عدد الأحرف) التي تقوم بتخزينها مؤقتًا حاليًا قبل معالجتها.

اقترح الأشخاص في التعليقات أنه يجب عليك قراءة الملف سطرًا بسطر.إنها نصيحة جيدة للغاية على افتراض أنك قادر على معالجة سطر واحد من الملف في كل مرة.سيقوم نظام التشغيل بتخزين الملف مؤقتًا على أي حال حتى لا تفقد أي أداء.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top