Tiempo adecuado para abrir la transmisión durante la descompresión de un archivo que se pasará a un grupo de trabajadores

Esto puede ser más una pregunta teórica. Tengo un escenario en el que hay un archivo comprimido (~2 GB) que se descomprime en un archivo más grande (~22 GB). Este proceso toma aproximadamente 20 minutos, lo que a su vez significa que estoy perdiendo alrededor de 19 minutos y 59 segundos cada vez que se ejecuta este proceso. Mi pregunta es la siguiente: ¿Es posible abrir una secuencia del archivo que se está descomprimiendo y pasar la información a un programa separado que manipulará los datos? Esencialmente, cada línea en el archivo es un registro, pero no he podido encontrar una técnica para descubrir cuándo una línea se ha decodificado por completo durante la descompresión. Los algoritmos generales o las bibliotecas de Java son valiosos.

preguntado el 22 de mayo de 12 a las 14:05

No entiendo muy bien la pregunta. ¿Qué quiere decir con "No he podido encontrar una técnica para descubrir cuándo una línea se ha decodificado completamente durante la descompresión"? A medida que descomprime, obviamente obtiene los datos descomprimidos. Entonces, si conoce la estructura de sus datos, sabrá cuándo terminan sus registros. Además, no entiendo "Estoy perdiendo alrededor de 19 minutos y 59 segundos cada vez que se ejecuta este proceso". ¿Significa esto que su aplicación está decodificando 22 GB cada vez que quiere procesar un solo registro en algún lugar de esos 22 GB? -

@MarkAdler No, no es descomprimir encontrar un solo registro, este proceso se ejecuta cada pocas horas con datos nuevos. La confusión que tengo es si la descompresión va de arriba a abajo o si hace algún tipo de búsqueda donde los datos salen al azar. -

La descompresión opera en serie de principio a fin. ¿Qué es exactamente lo que quieres hacer? ¿Quiere simplemente acceder a algunos datos en el medio? -

@MarkAdler Básicamente, quiero saber cuándo llego al final de una línea dentro del archivo de esa manera puedo enviarlo correctamente a un búfer. Quiero leer todos los datos y procesarlos línea por línea. -

2 Respuestas

Puede usar el java.util.zip's GZIPInputStream para leer el archivo gzip secuencialmente. Luego puede implementar su propio almacenamiento en búfer y extraer líneas, o usar BufferedReader con readLine método.

contestado el 22 de mayo de 12 a las 20:05

Sí, esto es fácil. En Unix, podrías hacer

bzcat compressedfile.bz2 | mainprogram

Luego, su programa principal puede leer el flujo descomprimido en la entrada estándar. Existen programas de línea de comandos similares para zip y gzip.

Si el programa principal necesita leer de un archivo en lugar de una entrada estándar, use un tubería nombrada.

Si está en Windows, puede haber o no herramientas similares.

contestado el 22 de mayo de 12 a las 20:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.