كيف تكتب نهاية الملف المفتوح باستخدام FILE_FLAG_NO_BUFFERING؟

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

  •  02-07-2019
  •  | 
  •  

سؤال

أنا أستخدم VB6 وWin32 API لكتابة البيانات إلى ملف، وهذه الوظيفة مخصصة لتصدير البيانات، وبالتالي فإن أداء الكتابة على القرص هو العامل الرئيسي في اعتباراتي.على هذا النحو أنا أستخدم FILE_FLAG_NO_BUFFERING و FILE_FLAG_WRITE_THROUGH الخيارات عند فتح الملف مع استدعاء ل CreateFile.

FILE_FLAG_NO_BUFFERING يتطلب استخدام المخزن المؤقت الخاص بي وكتابة البيانات إلى الملف بمضاعفات حجم قطاع القرص، وهذه ليست مشكلة بشكل عام، باستثناء الجزء الأخير من البيانات، والذي إذا لم يكن مضاعفًا دقيقًا لحجم القطاع فسوف يتضمن حرفًا حشوة الصفر للملف، كيف يمكنني ضبط حجم الملف بمجرد كتابة الكتلة الأخيرة بحيث لا تتضمن هذه الأحرف الصفرية؟

استطيع ان استخدم SetEndOfFile ولكن هذا يتطلب مني إغلاق الملف وإعادة فتحه دون استخدام FILE_FLAG_NO_BUFFERING.لقد رأيت شخص يتحدث عنه NtSetInformationFile ولكن لا يمكنني العثور على كيفية استخدام هذا وإعلانه في VB6. SetFileInformationByHandle يمكنني فعل ما أريده بالضبط، ولكنه متوفر فقط في نظام التشغيل Windows Vista، ويجب أن يكون تطبيقي متوافقًا مع الإصدارات السابقة من Windows.

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

المحلول

لست متأكدًا، ولكن هل أنت متأكد من أن إعداد FILE_FLAG_NO_BUFFERING وFILE_FLAG_WRITE_THROUGH يمنحك أقصى قدر من الأداء؟

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

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

لماذا لا تقوم بقياس الكود الخاص بك بدون هذه الخيارات؟اترك منطق الحشو 0 بايت لجعله اختبارًا عادلاً.

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

نصائح أخرى

أعتقد أن SetEndOfFile هو السبيل الوحيد.

وأنا أتفق مع مايك ج.أنه يجب عليك وضع الكود الخاص بك مع FILE_FLAG_NO_BUFFERING وبدونه.يعد التخزين المؤقت لملفات Windows على أنظمة التشغيل الحديثة فعالاً للغاية.

حسنا أنا مندهش!استخدام التخزين المؤقت لنظام Windows بدلاً من القيام بكل ذلك بنفسي كثيراً أسرع.لقد قمت بكتابة ملف بحجم 1 جيجا بايت لاختباره باستخدام المخزن المؤقت الخاص بي وملف FILE_FLAG_NO_BUFFERING و FILE_FLAG_WRITE_THROUGH استغرقت الخيارات في المتوسط ​​21.146 ثانية، وبدون هذه الإعدادات واستخدام المخزن المؤقت لنظام التشغيل Windows، انخفض متوسط ​​الوقت إلى 13.53 ثانية، وهذا أسرع بنسبة تزيد عن 30%!

ملاحظة في تقرير المصير:لا حاجة إلى إعادة اختراع العجلة.؛-)

شكرًا لك 'مايك ج"لإجابتك السريعة والدقيقة.والشكر لك أيضاً"جبر"، لا داعي للقلق SetEndOfFile على الإطلاق الآن.

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

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