2009-04-16 18 views
7

Tengo un programa que lee y escribe archivos de texto muy grandes. Sin embargo, debido al formato de estos archivos (son representaciones ASCII de lo que deberían haber sido datos binarios), estos archivos se comprimen muy fácilmente. Por ejemplo, algunos de estos archivos tienen más de 10 GB de tamaño, pero gzip logra una compresión del 95%.¿Cómo puedo comprimir/descomprimir un archivo de forma transparente a medida que un programa escribe/lee de él?

No puedo modificar el programa, pero el espacio en el disco es precioso, así que tengo que configurar una forma de que pueda leer y escribir estos archivos mientras se comprimen y descomprimen de forma transparente.

El programa solo puede leer y escribir archivos, por lo que tengo entendido, necesito configurar un conducto con nombre para entrada y salida. Algunas personas sugieren un sistema de archivos comprimido, que parece que también funcionaría. ¿Cómo hago cualquiera de los dos trabajos?

Información técnica: Estoy en un Linux moderno. El programa lee un archivo de entrada y salida por separado. Se lee a través del archivo de entrada en orden, aunque dos veces. Escribe el archivo de salida en orden.

+0

No dude en editar mis etiquetas. Me resultó muy difícil elegir los apropiados. Además, si esto es un duplicado, como siempre, házmelo saber y estaré encantado de borrar ... –

+1

esto no está relacionado con la programación, ya que no puedes cambiar tu programa. o necesita discos más grandes o un sistema de archivos comprimido r/w. – Alnitak

Respuesta

5

Echa un vistazo a zlibc: http://zlibc.linux.lu/.

Además, si fusible es una opción (es decir, el núcleo no es demasiado viejo), considere: compFUSEd http://www.biggerbytes.be/

+0

¿Puedo escribir con zlibc también? Es tan crucial que puedo escribir como leído. –

+0

zlibc es principalmente para escribir nuevos programas que se comprimen, y usted dijo que no podía tocar su programa. Voté este para la mención de compuFUSEd, que parece una buena opción para su problema. – unwind

+0

zlibc es de solo lectura, pero definitivamente se puede usar sin recompilar también, a través del mecanismo LD_PRELOAD. – EFraim

2

Las tuberías con nombre no le proporcionarán operaciones full duplex, por lo que será un poco más complicado si necesita proporcionar solo un nombre de archivo.

¿Sabes si tus aplicaciones necesitan buscar a través del archivo?

¿Su aplicación funciona con stdin, stdout?

Tal vez una solución es crear un mini sistema de archivo comprimido que contiene sólo un directorio con los archivos de

Puesto que usted tiene de entrada independiente y archivo de salida que pueden hacer lo siguiente:

mkfifo readfifo 
mkfifo writefifo 
zcat your inputfile > readfifo & 
gzip writefifo > youroutputfile & 

launch your program ! 

Ahora, probablemente se meterá en problemas con la lectura dos veces en orden de entrada, porque tan pronto como zcat termine de leer el archivo de entrada, su programa obtendrá una señal SIGPIPE

La solución adecuada es probablemente usar un sistema de archivos comprimido como CompFUSE, porque entonces no tienes que preocuparte por operaciones no compatibles como seek.

+0

He editado mi pregunta para resolver sus dudas. El programa no lee ni escribe stdin/out. –

0

qué idioma está usando?

Si está utilizando Java, eche un vistazo a las clases GZipInputStream y GZipOutputStream en el documento API.

Si está utilizando C/C++, zlibc es probablemente la mejor manera de hacerlo.

+0

No puedo cambiar el programa, así que esto debe funcionar fuera del programa. Soy genial con cualquier idioma, pero pensé que esto era más funcional con Linux que con cualquier programación. –

Cuestiones relacionadas