تنسيقات الضغط مع دعم جيد للوصول العشوائي داخل الأرشيف؟

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

سؤال

هذا مشابه ل السؤال السابق, لكن الإجابات هناك لا تلبي احتياجاتي وسؤالي مختلف قليلاً:

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

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

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

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

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

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

المحلول

وأنا لا أعرف من أي شكل ملف مضغوط التي من شأنها أن تدعم الوصول العشوائي إلى موقع معين في البيانات غير المضغوطة (وأيضا، ما عدا صيغ الوسائط المتعددة)، ولكن يمكنك الشراب بنفسك.

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

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

نصائح أخرى

نلقي نظرة على dictzip.وهو متوافق مع gzip ويسمح بالوصول العشوائي الخشن.

مقتطف من صفحة الرجل الخاصة به:

dictzip ضغط الملفات باستخدام com.gzip(1) الخوارزمية (LZ77) بطريقة متوافقة تمامًا مع تنسيق ملف GZIP.يسمح امتداد إلى تنسيق ملف GZIP (حقل إضافي ، الموصوف في 2.3.1.1 من RFC 1952) لتخزين بيانات إضافية في رأس ملف مضغوط.ستتجاهل برامج مثل GZIP و ZCAT هذه البيانات الإضافية.ومع ذلك ، فإن [Dictzcat-START] سوف يستفيد من هذه البيانات لأداء وصول عشوائي زائفة على الملف.

لدي الحزمة dictzip في أوبونتو.أو كود المصدر الخاص به موجود في ملف dictd-*.tar.gz.ترخيصها هو GPL.أنت حر في دراستها.

تحديث:

لقد قمت بتحسين dictzip بحيث لا يوجد حد لحجم الملف.التنفيذ الخاص بي تحت ترخيص معهد ماساتشوستس للتكنولوجيا.

.xz تنسيق ملف (والذي يستخدم ضغط LZMA) ويبدو لدعم هذا:

<اقتباس فقرة>   

على وصول عشوائي القراءة : لويمكن تقسيم البيانات إلى كتل مضغوطة بشكل مستقل. يحتوي كل ملف .xz مؤشر الكتل، مما يجعل محدودية الوصول العشوائي القراءة ممكن عندما يكون حجم كتلة صغيرة بما يكفي.

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

توجد حلول لتوفير الوصول العشوائي إلى أرشيفات gzip وbzip2:

(أنا أبحث عن شيء ل7zip)

وbgzip يمكن ضغط الملفات في البديل gzip وهو الفهرسة (ويمكن ضغط من قبل gzip). ويستخدم هذا في بعض التطبيقات المعلوماتية الحيوية، جنبا إلى جنب مع مفهرس tabix.

وانظر التوضيحات هنا: HTTP: // blastedbio .blogspot.fr / 2011/11 / bgzf-منعت-أكبر-أفضل gzip.html ، وهنا: <لأ href = "http://www.htslib.org/doc/tabix.html" يختلط = "نوفولو noreferrer"> http://www.htslib.org/doc/tabix.html .

وأنا لا أعرف إلى أي مدى هو قابل للتكيف إلى تطبيقات أخرى.

ولست متأكدا إذا كان هذا من شأنه أن يكون عمليا في الوضع المحدد الخاص بك، ولكن لا يمكن لك فقط غزيب كل الملفات الكبيرة إلى ملفات أصغر، ويقول 10 MB كل؟ سوف ينتهي بك الأمر مع مجموعة من الملفات: file0.gz، file1.gz، file2.gz، وما إلى ذلك بناء على معطى إزاحة ضمن الأصلي كبيرة، هل يمكن البحث في الملف المسمى "file" + (offset / 10485760) + ".gz". الإزاحة ضمن سيتم offset % 10485760 أرشيف مضغوط.

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

قد تنظر إلى "الضغط:مفتاح أنظمة استرجاع النص من الجيل التالي "من تأليف Nivio Ziviani و Edleno Silva de Moura و Gonzalo Navarro و Ricardo Baeza-yates Inحاسوب مجلة نوفمبر 2000http://doi.ieeecomputersociety.org/10.1109/2.881693

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

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

يمكنك منح كل كلمة رمزًا فريدًا مكونًا من 2 بايت، نظرًا لأنه من المحتمل أن يكون لديك أقل من 65000 كلمة فريدة في النص الخاص بك.(هناك ما يقرب من 13000 كلمة فريدة في الكتاب المقدس بطبعة الملك جيمس).حتى لو كان هناك أكثر من 65000 كلمة، فمن السهل جدًا تعيين أول 256 كلمة من الكود ثنائي البايت لجميع البايتات الممكنة، حتى تتمكن من تهجئة الكلمات غير الموجودة في قاموس الـ 65000 كلمة أو نحو ذلك "الأكثر شيوعًا" كلمات وعبارات".(عادةً ما يكون الضغط المكتسب عن طريق تعبئة الكلمات والعبارات المتكررة في بايتين يستحقون "توسيع" التهجئة في بعض الأحيان عن كلمة باستخدام بايتين لكل حرف).هناك مجموعة متنوعة من الطرق لاختيار معجم "الكلمات والعبارات المتكررة" الذي يوفر ضغطًا مناسبًا.على سبيل المثال، يمكنك تعديل ضاغط LZW لتفريغ "العبارات" التي يستخدمها أكثر من مرة في ملف المعجم، سطرًا واحدًا لكل عبارة، وتشغيله على جميع بياناتك.أو يمكنك تقطيع بياناتك غير المضغوطة بشكل عشوائي إلى 5 عبارات بايت في ملف معجم، سطر واحد لكل عبارة.أو يمكنك تقطيع بياناتك غير المضغوطة إلى كلمات إنجليزية فعلية، ووضع كل كلمة - بما في ذلك المسافة في بداية الكلمة - في ملف المعجم.ثم استخدم "sort --unique" لإزالة الكلمات المكررة في ملف المعجم هذا.(هل لا يزال اختيار قائمة الكلمات المعجمية "المثالية" يعتبر أمرًا صعبًا؟)

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

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

حلان ممكنان:

  1. اسمح لنظام التشغيل بالتعامل مع الضغط، وقم بإنشاء وتثبيت نظام ملفات مضغوط (SquashFS أو clicfs أو cloop أو cramfs أو e2compr أو أي شيء آخر) يحتوي على جميع ملفاتك النصية ولا تفعل أي شيء بشأن الضغط في برنامج التطبيق الخاص بك.

  2. استخدم clicfs مباشرةً على كل ملف نصي (نقرة واحدة لكل ملف نصي) بدلاً من ضغط صورة نظام الملفات.فكر في أن "mkclicfs mytextfile mycompressedfile" هو "gzip <mytextfile >mycompressedfile" و"clicfs mycompressedfile Directory" كطريقة للحصول على وصول عشوائي إلى البيانات عبر الملف "directory/mytextfile".

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

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

وهذا هو السؤال القديم جدا ولكن يبدو zindex يمكن أن توفر حلا جيدا (على الرغم من أنني دون 'ر لديهم خبرة كبيرة معها)

وrazip يدعم الوصول العشوائي مع أداء أفضل من غزيب / BZIP2 التي يجب أن أنب لهذا الدعم - خفض ضغط على حساب "موافق" الوصول العشوائي:

http://sourceforge.net/projects/razip/

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

وتحولت

والبيانات لكل كروموسوم لإزالة التكرار في الإحداثيات الجينومية، ويتم ضغط البيانات المحولة مع أي bzip2 أو خوارزميات gzip. ومتصلا البيانات الجينية التعويضات، البيانات الوصفية ومضغوطة في ملف واحد.

متاح من وجهة نظرنا الموقع جيثب

وشفرة المصدر. قمنا بتجميع تحت لينكس وماك OS X.

لقضيتك، هل يمكن تخزين (10 MB، أو أيا كان) إزاحة في رأس إلى تنسيق أرشيف المخصصة. يمكنك تحليل رأس، استرداد التعويضات، وfseek تدريجيا من خلال ملف current_offset_sum + header_size.

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