سؤال

قد يقع هذا في نطاق "غير ممكن حقًا" أو "لا يستحق الجهد المبذول حقًا" ولكن هنا يبدأ.

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

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

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

المحلول

وتصميم GZIP، كما كنت قد أدركت، ليست صديقة للالوصول العشوائي.

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

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

وهذه سوف تكون سريعة معقول لملفات أدناه 100K. تماما كما تخمين، إذا كان لديك 10 ملفات حول 100K لكل منهما، فإنه من المحتمل أن يتم في 2S على وحدة المعالجة المركزية الحديثة. هذا ما أعنيه "سريع جدا". ولكن فقط معرفة متطلبات الأداء الإقتصادي الأداء من التطبيق الخاص بك.

هل لديك فئة GZipInputStream؟ إذا كان الأمر كذلك كنت في منتصف الطريق هناك.

نصائح أخرى

ال بغزف تم تطوير تنسيق الملف المتوافق مع GZIP بواسطة علماء الأحياء.

(...) ميزة BGZF على GZIP التقليدية هي أن BGZF يسمح بالسعي دون الحاجة إلى مسح من خلال الملف بأكمله حتى الموقف الذي يتم البحث عنه.

في http://picard.svn.sourceforge.net/viewvc/picard/trunk/src/Java/net/sf/samtools/util/ ، قم بإلقاء نظرة على BlockCompressedOutputStream وBlockCompressedInputStream.java

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