Frage

Dies kann im Bereich der „nicht wirklich machbar“ oder „nicht wirklich die Mühe wert“ fallen, aber hier geht.

Ich versuche zufällig Datensätze innerhalb einer mehrteiligen gzip-Datei gespeichert ist, zugreifen. Insbesondere werden die Dateien, die ich interessiert bin komprimiert Heretrix Arc-Dateien. (Falls Sie nicht vertraut ist mit mehrteiligen gzip-Dateien, die gzip spec mehr gzip-Streams ermöglicht in einer einzigen gzip-Datei verknüpft werden. Sie teilen keine Dictionary-Informationen, es ist einfach binäres Anfügen.)

Ich denke, es möglich sein, sollte dies innerhalb der Datei-Offset auf einem bestimmten von der Suche nach zu tun, dann scannen für das gzip Magie Header-Bytes (dh 0x1f8b, gemäß dem RFC ) und versucht, den gzip-Stream aus dem folgende Bytes zu lesen. Das Problem bei diesem Ansatz ist, dass die gleichen Bytes wie auch in den aktuellen Daten angezeigt werden können, so dass für diesen Bytes suchen zu einer ungültigen Position führen können, aus der Lektüre einen gzip-Stream zu starten. Gibt es eine bessere Art und Weise mit wahlfreiem Zugriff zu handhaben, da die Plattenverschiebungen werden nicht a priori bekannt?

War es hilfreich?

Lösung

Das Design von GZIP, wie Sie bemerkt haben, ist nicht freundlich zu Random Access.

Sie können tun, was Sie beschreiben, und dann, wenn Sie einen Fehler in der Dekompressor laufen, schließen daraus, dass die Signatur, die Sie tatsächlich komprimierten Daten gefunden wurde.
Wenn Sie fertig sind Dekomprimieren, dann ist es leicht, die Gültigkeit des Stroms nur dekomprimiert, über die CRC-32 zu überprüfen.

Wenn die Dateien nicht so groß sind, könnten Sie einfach alle Einträge in Serie Dekomprimieren und Beibehaltung der Offsets der Signaturen, um ein Verzeichnis zu bauen. Wie Sie den Bytes auf einen Bit Bucket dekomprimieren, Dump. An diesem Punkt haben Sie ein Verzeichnis erstellt, und Sie können dann mit wahlfreiem Zugriff basierend auf Dateinamen, Datum oder anderen Metadaten unterstützen.

Dies wird für Dateien unter 100k ziemlich schnell sein. So wie eine Vermutung, wenn Sie 10 Dateien von rund 100k hatte jeder, wäre es wahrscheinlich in 2s auf einer modernen CPU durchgeführt werden. Das ist, was ich mit „ziemlich schnell“. Aber nur Sie kennen die perf Anforderungen Ihrer Anwendung.

Haben Sie eine GZipInputStream Klasse haben? Wenn ja Sie sind auf halbem Weg gibt.

Andere Tipps

Das BGZF Dateiformat kompatibel mit GZIP von den Biologen entwickelt wurde.

  

(...) Der Vorteil   BGZF gegenüber herkömmlichem gzip ist, dass   BGZF ermöglicht sucht, ohne   durch die gesamte Datei bis zu scannen   die Position gesucht.

http: / /picard.svn.sourceforge.net/viewvc/picard/trunk/src/java/net/sf/samtools/util/ , haben einen Blick auf BlockCompressedOutputStream und BlockCompressedInputStream.java

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top