سؤال

يتتبع تطبيقي حالة حوالي 1000 كائن.تتم قراءة هذه الكائنات وكتابتها إلى مخزن ثابت (متسلسل) بدون ترتيب معين.

يستخدم التطبيق الآن السجل لتخزين حالة كل كائن.وهذا جميل لأنه:

  • انها بسيطة

  • سريع جدا

  • يمكن قراءة/كتابة حالة الكائن الفردي دون الحاجة إلى قراءة كيان أكبر (مثل سحب مقتطف من ملف XML كبير)

  • يوجد محرر لائق (RegEdit) يسمح بمعالجة العناصر الفردية بسهولة

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

أي اقتراحات أفضل؟مجموعة من الملفات المسطحة؟

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

المحلول

إذا بدأت بالفعل في تجربة SQLite، فيجب أن تعلم أن الأمر "الجاهز" قد لا يبدو بالسرعة التي تريدها، ولكن يمكن جعله أسرع بكثير بسرعة من خلال تطبيق بعض نصائح التحسين المعمول بها:

تحسين سكليتي

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

بالنسبة لقواعد البيانات في الذاكرة، قم بتمرير NULL كوسيطة اسم الملف إلى sqlite3_open و تأكد من تعريف TEMP_STORE بشكل مناسب

على الجانب الآخر, ، إذا طلبت من sqlite استخدام القرص الصلب، فستحصل على فائدة مماثلة لاستخدامك الحالي لـ RegEdit لمعالجة بيانات البرنامج "أثناء التنقل".

الطريقة التي يمكنك من خلالها محاكاة تقنية RegEdit الحالية باستخدام sqlite هي استخدام أداة سطر أوامر sqlite للاتصال بقاعدة البيانات الموجودة على القرص.يمكنك تشغيل عبارات UPDATE على بيانات SQL من سطر الأوامر أثناء تشغيل البرنامج الرئيسي (و/أو أثناء إيقافه مؤقتًا في وضع الاستراحة).

نصائح أخرى

إذا كان ما تقصده بـ "قارئ متعدد/كاتب متعدد" هو أنك تحتفظ بالكثير من سلاسل الرسائل التي تكتب إلى المتجر بشكل متزامن، فإن SQLite آمن لمؤشرات الترابط (يمكنك الحصول على تحديدات متزامنة ويتم التعامل مع عمليات الكتابة المتزامنة بشفافية).راجع [الأسئلة الشائعة [1]] و grep لـ "threadsafe"

[1]: http://www.sqlite.org/faq.html/ التعليمات

أشك في أن أي شخص عاقل سوف يسلك هذا الطريق هذه الأيام، ولكن بعض ما تصفه يمكن القيام به باستخدام Windows التخزين المنظم/المركب.أذكر هذا فقط لأنك تسأل عنه شبابيك - وكانت هذه طريقة Windows الرسمية للقيام بذلك.

هذه هي الطريقة التي تم بها تجميع ملفات DOC معًا (ولكن ليس تنسيق DOCX الجديد).من MSDN سيبدو الأمر معقدًا حقًا، لكنني استخدمته، فهو ليس كذلك أسوأ واجهة برمجة التطبيقات في Win32.

  • إنها لا بسيط
  • إنه سريع، وأود أن يخمن إنه أسرع ثم التسجيل.
  • يمكن قراءة/كتابة حالة الكائن الفردي دون الحاجة إلى قراءة كيان أكبر.
  • لا يوجد محرر لائق، ولكن هناك بعض الأشياء الأساسية الحقيقية (يحتوي VC++ 6.0 على "DocFile Viewer" ضمن الأدوات.(نعم، هذا ما فعله هذا الشيء) لقد وجدت عدد قليل أكثر متصل.
  • تحصل على ملف بدلاً من مفاتيح التسجيل.
  • يمكنك الحصول على بعض المصداقية المهووسة لمطوري Windows في المدرسة القديمة.

أفكار عشوائية أخرى:أعتقد أن لغة XML هي الحل الأمثل (على الرغم من مشكلة الوصول العشوائي).تبا، قد تعمل ملفات INI.يمنحك السجل أمانًا جيدًا للغاية إذا كنت في حاجة إليه - يبدو أن الأشخاص ينسون ذلك عندما تكون المطالبة باستخدام الملفات أفضل.تبدو قاعدة البيانات المضمنة وكأنها مبالغة لو أنا أفهم ما تفعله.

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

إذا كان لديك هياكل ذات حجم ثابت، فهل يمكنك التفكير في استخدام ملف معين للذاكرة وتخصيص الذاكرة منه؟

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

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