سؤال

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

  • لديك واحدة مفتوحة للكتابة، وقررت لاحقًا عدم حفظها
  • يكون مفتوحًا للقراءة، ثم يقرر لاحقًا حفظه

يستخدم تطبيقنا ملفًا مخصصًا للذاكرة قابلاً للكتابة لحفظ ملفات البيانات، ولكن نظرًا لأن المستخدم قد يرغب في الخروج دون حفظ التغييرات، يتعين علينا استخدام ملف مؤقت يقوم المستخدم بتحريره بالفعل.عندما يختار المستخدم حفظ التغييرات، تتم الكتابة فوق الملف الأصلي بالملف المؤقت بحيث يحتوي على أحدث التغييرات.يعد هذا أمرًا مرهقًا لأن الملفات يمكن أن تكون كبيرة جدًا (> 1 جيجابايت) ويستغرق نسخها وقتًا طويلاً.

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

FMapHandle := CreateFileMapping(FFileHandle, nil, PAGE_READWRITE, 0, 2 * 65536, nil);
FBasePointer := MapViewOfFile(FileMapHandle, FILE_MAP_WRITE, FileOffsetHigh,
FileOffsetLow, NumBytes);
هل كانت مفيدة؟

المحلول

أنا لا أعتقد أنك تستطيع.وأعني بذلك أنت يمكن تكون قادرة على ذلك، ولكن هذا لا معنى له بالنسبة لي :-)

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

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

تحديث:

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

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

نصائح أخرى

ممكن، ولكن ليس تافهة.

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

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

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

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

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