سؤال

أحاول فهم تنسيق الملف لمؤشر Visual FoxPro المضغوط (*.idx). أنا أشير حاليا إلى وثائق Microsoft للارشاد.

الفهرس هو شجرة B لعقد 512 بايت. كل ورقة ("خارج السطح") تحتوي على إدخالات متعددة. يتكون كل إدخال من أربع قطع من البيانات:

  • رقم الصف [الطول الثابت
  • عدد البايتات المكررة (الوثائق لا تفسر هذا) [طول ثابت
  • عدد البايتات المتخيل (الوثائق لا تفسر هذا) [طول ثابت
  • المفتاح [الطول المتغير

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

  • 24 بايت رأس
  • رقم الصف ، عدد البايتات المكررة ، عدد البايتات الزائدة (الإدخال رقم 1)
  • رقم الصف ، عدد البايتات المكررة ، عدد البايتات الزائدة (الإدخال رقم 2)
  • رقم الصف ، عدد البايتات المكررة ، عدد البايتات المتخيل (الإدخال رقم 3)
  • ...
  • المفتاح (الإدخال رقم 3)
  • المفتاح (الإدخال رقم 2)
  • المفتاح (الإدخال رقم 1)

كيف يمكنني تحديد الأطوال الفردية للمفاتيح؟ لا يبدو أن الوثائق تحدد هذا. فهي متجاورة تماما (لا توجد فواصل بايت لاغية).

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

أعتقد أن تنسيقات ملف FoxPro مشتقة من معيار XBASE. ربما هذا يرن جرس؟

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

المحلول

بعد اكتشاف وحدة XBase :: Index Perl ، قررت أن المفاتيح في العقدة الخارجية هي نفس طول المفاتيح ذات الطول الثابت الموجود في العقد الداخلية ، باستثناء أي مساحات زائدة. هذا هو ما يشير إليه "عدد البايتات المتخلف" المذكورة في الوثائق (كم عدد المساحات التي تم اقتطاعها من نهاية المفتاح). ما زلت لم أحدد ماهية "عدد البايتات المكررة" ، لكن الوحدة على الأقل أوضحت علاقتها:

variable_key_length = fixed_key_length - duplicate_byte_count - trailing_byte_count

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

نصائح أخرى

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

في فهرسة Xbase نادراً ما يتجاوز 10 أحرف أو 15 (نادر) عند استخدام المؤشرات (فهرس مناقشة النصوص).

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

يقول Microsoft هذا حول بنية ملف IDX (وفي أسفل الصفحة ، توجد روابط لجميع الآخرين مثل تنسيق فهرس مضغوط.)

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