2009-07-25 18 views
35

Quiero emular la funcionalidad de gzcat | cola -n.¿Cómo puedo rastrear un archivo comprimido sin leer todo su contenido?

Esto sería útil para los tiempos en que hay archivos enormes (de algunos GB más o menos). ¿Puedo alinear las últimas líneas de dicho archivo sin leerlo desde el principio? Dudo que esto no sea posible ya que supongo que para gzip, la codificación dependerá de todo el texto anterior.

Pero aún me gustaría saber si alguien ha intentado hacer algo similar, tal vez investigando sobre un algoritmo de compresión que podría proporcionar esa característica.

+0

gzip no es textual, pero binario. Entonces, no hay "líneas" como en los datos de texto que 'tail' podría devolver. – Gumbo

+0

Es posible que desee comprobar [una pregunta similar en SO] (http://stackoverflow.com/questions/14225751/random-access-to-gzipped-files), [las preguntas frecuentes de zlib] (http://zlib.net /zlib_faq.html#faq28) y [examples/zran.c] (https://github.com/madler/zlib/blob/master/examples/zran.c) en [zlib] (http: // zlib. red) distribución. –

Respuesta

36

No, no puedes. El zipping algorithm funciona en transmisiones y adapta sus codificaciones internas a lo que contiene la transmisión para lograr su alta relación de compresión.

Sin saber cuál es el contenido de la secuencia antes de cierto punto, es imposible saber cómo proceder a la descompresión desde ese momento.

Cualquier algoritmo que le permita descomprimir partes arbitrarias requerirá múltiples pasadas sobre los datos para comprimirlo.

+6

Esto es parcialmente cierto, dependiendo de cómo se haya construido el archivo. Los archivos gzip pueden contener múltiples flujos, siendo este último completamente independiente de los anteriores. Puede concatenar archivos gzip juntos y aún tener un archivo gzip válido. No conozco los detalles, pero supongo que es posible encontrar la ubicación de la última restauración de la secuencia, suponiendo que lo que escribió la secuencia se reinicie muy a menudo. – mc0e

3

Si tiene control sobre lo que entra en el archivo en primer lugar, si es como un archivo ZIP puede almacenar trozos de tamaño predeterminado con nombres de archivo en orden numérico creciente y luego descomprimir el último trozo/archivo.

+3

Esto suena como un buen compromiso. Sin embargo, el OP debe ser consciente de que esto reducirá la relación de compresión. Si las pruebas muestran que el cambio de relación es aceptable, esta es una gran idea. –

+1

En realidad, puede lograr esto reiniciando el diccionario de compresión a mitad de camino a través de un archivo, eliminando así la necesidad de dividir el archivo en trozos. –

7

BGZF se utiliza para crear archivos comprimidos BAM index gzip creados por Samtools. Estos son accesibles al azar.

http://samtools.sourceforge.net/

+1

Exactamente. ¡Sin embargo, no es solo para samtools o para BAM! Creo que funcionará para cualquier dato delimitado por líneas. –

+1

Los archivos BGZF permiten el acceso a desplazamientos de bytes aleatorios dentro de gzips especialmente construidos al limitar primero el tamaño del bloque, y luego para cada bloque almacenar su longitud en un encabezado BC (que gzip ignora) para permitir el acceso aleatorio sin descomprimir. Las herramientas como BAM almacenan compensaciones al almacenar el desplazamiento del inicio del bloque y también el desplazamiento dentro del bloque. Para obtener una indexación orientada a la línea necesita algo como un archivo Bai o Tabix que lo acompaña (aunque estos son formatos y genomas específicos) para mapear desde su (s) línea (s) deseada (s) a offset. –

1

Si se trata de una opción y bzip2 podría ser un algoritmo de compresión mejor utilizar para este propósito.

Bzip2 utiliza un esquema de compresión de bloques. Como tal, si toma un trozo del final de su archivo que está seguro es lo suficientemente grande como para contener todo el último trozo, puede recuperarlo con bzip2recover.

El tamaño del bloque se puede seleccionar en el momento en que se escribe el archivo. De hecho, eso es lo que sucede cuando configura -1 (o --fast) a -9 (o --best) como opciones de compresión, que corresponden a tamaños de bloque de 100k a 900k. El valor predeterminado es 900k.

Las herramientas de línea de comandos bzip2 no le dan una buena manera amistosa de hacer esto con una tubería, pero dado que bzip2 no está orientado a la transmisión, quizás eso no sea sorprendente.

Cuestiones relacionadas