سؤال

لدي جهاز المحاكاة الذي يقرأ كبيرة من البيانات الثنائية الملفات التي نقوم بإنشائها (10s إلى 100s من GB).نحن نستخدم ثنائي السرعة الأسباب.هذه الملفات هي نظام يعتمد, تحويل من ملفات نصية على كل نظام تشغيل ، لذلك أنا لست قلقا حول قابلية.الملفات حاليا العديد من الحالات من جراب البنية مكتوبة مع fwrite.

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

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

المحلول

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

أنا أميل إلى مخزن البيانات الوصفية في الهيكل في نهاية الملف ، وليس بداية.هذا وقد اثنين من المزايا:

  • اقتطاع/غير منهي الملفات الكشف عنها بسهولة.
  • البيانات الوصفية الهوامش غالبا ما تكون إلحاق الملفات الموجودة دون تؤثر على قراءة التعليمات البرمجية.

أبسط الفوقية تذييل يمكنني استخدام تبدو شيئا مثل هذا:

struct MetadataFooter{
  char[40] creatorVersion;
  char[40] creatorApplication;
  .. or whatever
} 

struct FileFooter
{
  int64 metadataFooterSize;  // = sizeof(MetadataFooter)
  char[10] magicString;   // a unique identifier for the format: maybe "MYFILEFMT"
};

بعد البيانات الخام ، الفوقية تذييل الصفحة ثم الملف تذييل مكتوبة.

عند قراءة الملف ، تسعى إلى نهاية sizeof(FileFooter).قراءة تذييل الصفحة ، والتحقق من magicString.ثم طلب مرة أخرى وفقا metadataFooterSize و قراءة البيانات الوصفية.اعتمادا على تذييل حجم الواردة في الملف ، يمكنك استخدام القيم الافتراضية للحقول المفقودة.

كما KeithB يشير حتى يمكن استخدام هذه التقنية لتخزين البيانات الوصفية مثل سلسلة XML ، وإعطاء مزايا كل من تماما extensible metadata ، مع الاكتناز و سرعة البيانات الثنائية.

نصائح أخرى

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

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

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

إذا هم أن كبير، فما استقاموا لكم فاستقيموا حجز قطعة صحية (64K؟) من المساحة في بداية الملف ووضع البيانات الوصفية هناك في شكل XML يليه حرف نهاية ملف (على Ctrl-Z لDOS / ويندوز، CTRL-D ليونكس؟). وبهذه الطريقة يمكنك فحص وتحليل البيانات الوصفية بسهولة مع مجموعة واسعة من من toolsets هناك لXML.

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

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

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

وقالrstevens "معرف لنوع الملف '... المشورة السليمة. تقليديا، وهذا يسمى الرقم السحري و، في ملف، ليس على المدى الاعتداء (على عكس في التعليمات البرمجية، حيث هو مصطلح الاعتداء). في الأساس، هو بعض رقم - عادة ما لا يقل عن 4 بايت، وأنا عادة ضمان أن واحدا على الأقل من تلك بايت لا ASCII - التي يمكنك استخدامها للتحقق من أن الملف هو من النوع الذي نتوقع مع احتمال ضعيف لكونه الخلط . يمكنك أيضا كتابة قاعدة في / etc / السحر (أو ما يعادلها بالعملة المحلية) أن أعلن أن الملفات التي تحتوي على عدد السحر الخاص بك هي نوع ملف خاص بك.

ويجب أن تشمل رقم إصدار تنسيق الملف. ومع ذلك، أود أن أوصي بعدم استخدام عدد SVN من التعليمات البرمجية. قد تتغير التعليمات البرمجية الخاصة بك عندما يفعل تنسيق الملف لا.

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

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

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

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

في بضع الحالات، أضع قيمة 0x12345678 في رأس حتى أتمكن من اكتشاف إذا كان تنسيق الملف، يقابل endianism من الجهاز الذي تم معالجتها.

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

من الجميل أن يكون لديك ميزات حجم ثابت رأس (في البدء):

  • المشتركة 'طول' حقل (بما في ذلك رأس).
  • شيء مثل CRC32 (بما في ذلك رأس).

حسنا جزء متغير XML أو بعض الموسعة في شكل رأس هو فكرة جيدة ولكن هل هو حقا في حاجة ؟ كان لدي الكثير من الخبرة مع ASN ترميز...في معظم الحالات استخدام تجاوزت.

ربما سيكون لديك فهم إضافية عندما تنظر إلى الأمور مثل TPKT الشكل الذي يوصف في RFC 2126 (الفصل 4.3).

إذا كنت وضع رقم الإصدار في رأس يمكنك تغيير هذا الإصدار في أي وقت كنت بحاجة إلى تغيير البنية POD أو إضافة حقول جديدة إلى الرأس.

وحتى لا تضيف الاشياء لرأس الآن لأنه قد يكون مثيرا للاهتمام. كنت مجرد خلق التعليمات البرمجية التي لديك للحفاظ على ولكن لها قيمة حقيقية تذكر.

لملفات كبيرة، قد ترغب في إضافة تعريفات البيانات، بحيث يصبح تنسيق الملف الخاص بك واصفا ذاتيا.

وبلدي الاختلاف يجمع رودي والنهج جيسون S ل.

في ملخص - وضع مهيأ الفوقية النص في نهاية الملف مع وسيلة لتحديد طوله مخزنة في أي مكان

1) وضع حقل طول في بداية الملف حتى تعرف طول البيانات الوصفية في النهاية بدلا من افتراض طول ثابت. وبهذه الطريقة، للحصول على البيانات الوصفية التي قرأت للتو أن ذات طول ثابت المجال الأولي ومن ثم الحصول على سائل التعريف من نهاية الملف.

2) استخدام XML أو YAML أو JSON لبيانات التعريف. وهذا مفيد خصوصا / آمنة إذا تم إلحاق البيانات الوصفية في النهاية لأن لا أحد يقرأ الملف والذهاب الى اعتقد تلقائيا كل شيء XML فقط لأنه يبدأ مع XML.

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

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