Pregunta

Esto puede caer en el ámbito de "no realmente factible" o "no vale la pena el esfuerzo" pero aquí va.

Estoy intentando acceder aleatoriamente a los registros almacenados dentro de un archivo gzip de varias partes. Específicamente, los archivos que me interesan están comprimidos Heretrix archivos Arc. (En caso de que no esté familiarizado con los archivos gzip de varias partes, la especificación gzip permite que múltiples secuencias gzip se concatenen en un solo archivo gzip. No comparten ninguna información del diccionario, es un simple agregado binario).

Estoy pensando que debería ser posible hacer esto buscando un cierto desplazamiento dentro del archivo, luego escanear los bytes del encabezado mágico gzip (es decir, 0x1f8b, según RFC ) e intente leer la secuencia gzip de los siguientes bytes. El problema con este enfoque es que esos mismos bytes también pueden aparecer dentro de los datos reales, por lo que la búsqueda de esos bytes puede conducir a una posición no válida para comenzar a leer una secuencia gzip. ¿Existe una mejor manera de manejar el acceso aleatorio, dado que las compensaciones de registros no se conocen a priori?

¿Fue útil?

Solución

El diseño de GZIP, como te has dado cuenta, no es amigable para el acceso aleatorio.

Puede hacer lo que describe, y luego, si se encuentra con un error en el descompresor, concluya que la firma que encontró era en realidad datos comprimidos.
Si termina de descomprimir, es fácil verificar la validez de la secuencia que acaba de descomprimir, a través del CRC32.

Si los archivos no son tan grandes, puede considerar simplemente descomprimir todas las entradas en serie y conservar los desplazamientos de las firmas para construir un directorio. A medida que descomprime, volcar los bytes en un depósito de bits. En ese momento, habrá generado un directorio y podrá admitir el acceso aleatorio en función del nombre de archivo, la fecha u otros metadatos.

Esto será razonablemente rápido para archivos de menos de 100k. Solo como una suposición, si tuviera 10 archivos de alrededor de 100k cada uno, probablemente se haría en 2s en una CPU moderna. Esto es lo que quiero decir con "bastante rápido". Pero solo usted conoce los requisitos de rendimiento de su aplicación.

¿Tiene una clase GZipInputStream? Si es así, estás a medio camino.

Otros consejos

El formato de archivo BGZF , compatible con GZIP fue desarrollado por los biólogos.

  

(...) La ventaja de   BGZF sobre gzip convencional es que   BGZF permite buscar sin tener   para escanear todo el archivo hasta   el puesto que se busca.

En http: / /picard.svn.sourceforge.net/viewvc/picard/trunk/src/java/net/sf/samtools/util/ , eche un vistazo a BlockCompressedOutputStream y BlockCompressedInputStream.java

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top