سؤال

لدي تطبيق يتلقى قطع البيانات عبر الشبكة، وكتب هذه القرص. بمجرد استلام جميع القطع، يمكن فك تشفيرها / إعادة تخصيصها في الملف الفردي الذي يمثلهن في الواقع.

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

شعوري الخاص هو أنه قد يكون مفيدا للحالة الثانية فقط، أي شخص لديه بعض الأفكار حول هذا؟

تحرير: إنه تطبيق C #، وأنا أخطط فقط لإصدار X64. (لذلك يجب ألا تكون هناك مشكلة في "الأكبر الأكبر المساحة الادهة" ذات صلة)

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

المحلول

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

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

بالإضافة إلى ذلك، يمكن أن تعرض الملفات المعينة للذاكرة ميزات مثيرة للاهتمام مثل النسخ على الكتابة أو العمل كأساس للذاكرة المشتركة.

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

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

في .NET 4، أضافت Microsoft دعم الملفات المعينة بالذاكرة وهناك بعض المقالات الشاملة مع نموذج التعليمات البرمجية، على سبيل المثال http://blogs.msdn.com/salvapatuel/archive/2009/06/08/working-with-memory-mapped-files-in-net-4.aspx..

نصائح أخرى

يتم استخدام الملفات المعينة في الذاكرة بشكل أساسي لتواصل الاتصالات المعدلة أو تحسين أداء الإدخال / الإخراج.

في حالتك، هل تحاول الحصول على أداء أفضل من I / O؟

أكره الإشارة إلى الوثيقة، لكن ويكيبيديا تعطي هدوءا جيدا للموقف ...http://en.wikipedia.org/wiki/memory-mapped_file.

على وجه التحديد...

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

يبدو أنك على وشك التحسين قبل الأوان للسرعة. لماذا لا نهج ملف عادي، ثم إعادة تعداد ملفات MM لاحقا إذا لزم الأمر؟

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

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