هل هناك بدائل لإنشاء ملفات حاويات كبيرة عبارة عن منصة متقاطعة؟

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

سؤال

سابقا ، سألت سؤال.

المشكلة هي مطالب بنية الملفات لدينا عالية جدا.

على سبيل المثال ، نحاول إنشاء حاوية بها ما يصل إلى 4500 ملف وبيانات 500 ميغابايت.

بنية ملف هذه الحاوية تتكون من

  • SQLITE DB (أقل من 1 ميجابايت)
  • ملف يشبه XML القائم على النص
  • الصور داخل بنية مجلد ديناميكية تشكل بقية الملفات البالغ عددها 4500 ملف

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

  • يتم استخدام DB الصغيرة بانتظام عند الوصول إلى الحاوية.

القطران ، الرمز البريدي والأعجوبة كلها بطيئة للغاية (حتى مع ضغط 0). بطيء هو ذاتي أعلم ، ولكن لإلغاء حاوية بهذا الحجم أكثر من 20 ثانية.

أي أفكار؟

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

المحلول

ثلاثة أشياء.

1) ما قاله تيموثي والترز هو الصحيح ، سأذهب إلى مزيد من التفاصيل.

2) 4500 ملف و 500 ميجابايت من البيانات هو ببساطة الكثير من البيانات والقرص يكتب. إذا كنت تعمل على مجموعة البيانات بأكملها ، فستكون بطيئة. فقط أنا/س الحقيقة.

3) كما ذكر آخرون ، لا يوجد تفاصيل حول حالة الاستخدام.

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

باختصار ، إليك ما تفعله.

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

بعد ذلك ، إذن ، تقوم بتسلسل الملفتين معًا. في الحالة البسيطة ، لديك كتلة TOC أولاً ، ثم كتلة البيانات.

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

إذا كنت تريد أن تكون ذكيًا ، فيمكنك وضع TOC في نهاية ملف Blob. ثم ، قم بإلحاقها في النهاية ، إزاحة بداية TOC. بعد ذلك ، تصل إلى نهاية الملف ، احتياطيًا 4 أو 8 بايت (اعتمادًا على حجم رقمك) ، خذ هذه القيمة و LSEEK إلى أبعد من ذلك إلى بداية TOC الخاصة بك. ثم عدت إلى المربع الأول. أنت تفعل هذا حتى لا تضطر إلى إعادة بناء الأرشيف مرتين في البداية.

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

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

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

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

نصائح أخرى

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

هناك عدة خيارات لنظام الملفات المتاح: لكل من Berkeley UFS و Linux Ext2/Ext3 ، هناك مكتبات وضع المستخدم المتاحة. قد يكون من الممكن أيضًا أن تجد تنفيذًا للدهون في مكان ما. تأكد من فهم بنية نظام الملفات ، واختيار نظام يسمح بالتمديد - أعلم أن Ext2 سهل إلى حد ما (من خلال مجموعة كتلة أخرى) ، ويصعب تمديد الدهون (الحاجة إلى إلحاق الدهون).

بدلاً من ذلك ، يمكنك وضع تنسيق على القرص الظاهري حتى الآن أسفل نظام الملفات ، مما يسمح بإعادة التعيين التعسفي للكتل. بعد ذلك ، لا تحتاج كتل "Free" لنظام الملفات إلى الظهور على القرص ، ويمكنك تخصيص القرص الظاهري أكبر بكثير من ملف الحاوية الحقيقي.

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

يصبح الجزء الأصعب ثم إنشاء ملف البيانات الخاص بك + فهرس ، وحتى هذا أساسي للغاية!

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

أولاً ، شكرًا لك على توسيع سؤالك ، فهو يساعد كثيرًا في تقديم إجابات أفضل.

بالنظر إلى أنك ستحتاج إلى قاعدة بيانات SQLite على أي حال ، هل نظرت إلى أداء وضع كل شيء في قاعدة البيانات؟ تعتمد تجربتي على SQL Server 2000/2005/2008 ، لذا فأنا لست إيجابيًا لقدرات SQLite ، لكنني متأكد من أنه سيكون خيارًا سريعًا جدًا للبحث عن السجلات والحصول على البيانات ، مع السماح بحذف و/أو تحديث الخيارات.

عادةً ما لا أوصي بوضع ملفات داخل قاعدة البيانات ، ولكن بالنظر إلى أن الحجم الإجمالي لجميع الصور يبلغ حوالي 500 ميجابايت لـ 4500 صورة تبحث عنها ما يزيد قليلاً عن 100 ألف لكل صورة؟ إذا كنت تستخدم مسارًا ديناميكيًا لتخزين الصور ، فستكون في قاعدة بيانات أكثر تطبيعًا قليلاً ، يمكنك الحصول على جدول "PhickPaths" الذي يقوم بتعيين كل مسار إلى معرف ، ثم يمكنك البحث عن صور مع هذا pathid وتحميل البيانات من عمود Blob حسب الحاجة.

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

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

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

يفحص نظام الملفات الصلبة - يبدو أنه ما تحتاجه.

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