2012-06-18 16 views
5

proceso actual:Extraer un archivo de tar.gz, sin tocar el disco

  1. Tengo un archivo tar.gz. (En realidad, tengo alrededor de 2000 de ellos, pero esa es otra historia).
  2. Realizo un directorio temporal, extraigo el archivo tar.gz, revelando 100.000 archivos pequeños (alrededor de 600 bytes cada uno).
  3. Para cada archivo, lo incluyo en un programa de procesamiento, lo conecto a otro programa de análisis y guardo el resultado.

El espacio temporal en las máquinas que estoy utilizando apenas puede manejar uno de estos procesos a la vez, no importa el 16 (quad-core dual con doble capa) que reciben de forma predeterminada. Estoy buscando una forma de hacer este proceso sin guardar en el disco. Creo que la penalización de rendimiento para tirar archivos individualmente usando tar -xf $file -O <targetname> sería prohibitivo, pero podría ser a lo que me ato.

¿Hay alguna forma de hacerlo?

EDIT: Ya que dos personas ya han cometido este error, voy a aclarar:

  • Cada archivo representa un punto en el tiempo.
  • Cada archivo se procesa por separado.
  • Una vez procesadas (en este caso, una variante del análisis de Fourier), cada una proporciona una línea de salida.
  • Esta salida se puede combinar para hacer cosas como la autocorrelación en el tiempo.

Edit2: código real:

for f in posns/*; do 
    ~/data_analysis/intermediate_scattering_function < "$f" 
done | ~/data_analysis/complex_autocorrelation.awk limit=1000 > inter_autocorr.txt 
+0

¿Cuál es el tamaño total del archivo sin comprimir? ¿Cuánto carnero tienes? –

+0

100K archivos * 4 KB de tamaño mínimo de archivo = 400 MB. Tengo 16 GB, así que 16 encajarían sin mucho problema. – zebediah49

+0

Bueno, yo iba a decirle que use un ramdisk entonces, pero @Harald Brinkhof ya lo hizo :) –

Respuesta

4

Esto suena como un caso en el que la herramienta adecuada para el trabajo probablemente no sea un script de shell. Python tiene un módulo tarfile que puede operar en modo de transmisión, lo que le permite hacer solo una pasada a través del archivo grande y procesar sus archivos, mientras que aún puede distinguir los archivos individuales (lo que no ocurre con el enfoque tar --to-stdout).

+0

Reescribió el código de análisis en python; funcionó en un par de minutos en lugar de horas. – zebediah49

5

Si no se preocupan por los límites entre archivos, a continuación, tar --to-stdout -xf $file va a hacer lo que quiere; enviará los contenidos de cada archivo en el archivo a stdout uno después del otro.

Esto supone que está utilizando GNU tar, que es razonablemente probable si usa bash.

[Actualización]

Dada la restricción de que usted desea procesar cada archivo por separado, Estoy de acuerdo con Charles Duffy que un script de shell es la herramienta equivocada.

Puede probar su sugerencia de Python, o puede probar el Archive::Tar Perl module. Cualquiera de estos le permitirá iterar a través del contenido del archivo tar en la memoria.

+0

Desafortunadamente lo hago; cada archivo de destino debe procesarse por separado ... el resultado de eso se combina. – zebediah49

+0

+1 Esto ahorrará la sobrecarga de crear procesos cat '100000'. que es una gran cantidad de gastos generales guardados. – Paulpro

2

Puede usar un ramdisk (http://www.vanemery.com/Linux/Ramdisk/ramdisk.html) para procesarlo y cargarlo.(Me audazmente suponiendo que usa Linux pero otros sistemas UNIX deben tener el mismo tipo de provisiones)

+0

Estaba considerando tmpfs; eso requiere que convenza a un administrador para que lo haga. – zebediah49

4

Puede usar la opción tar --to-command=cmd para ejecutar el comando para cada archivo. Tar redirige el contenido del archivo a la entrada estándar del comando y establece algunas variables de entorno con detalles sobre el archivo, como TAR_FILENAME. Más detalles en Tar Documentation.

p. Ej.

tar zxf file.tar.gz --to-command='./process.sh' 

Tenga en cuenta que OSX utiliza bsdtar por defecto, que no tiene esta opción. Puede llamar explícitamente al gnutar.

+0

¡Agradable! Este es uno que no sabía. :) –

0
tar zxvf <file.tar.gz> <path_to_extract> --to-command=cat 

El comando anterior mostrará el contenido del archivo extraído sólo en la cáscara. No habrá cambios en el disco. El comando tar debe ser GNU tar.

registros de la muestra:

$ cat file_a 
aaaa 
$ cat file_b 
bbbb 
$ cat file_c 
cccc 
$ tar zcvf file.tar.gz file_a file_b file_c 
file_a 
file_b 
file_c 
$ cd temp 
$ ls <== no files in directory 
$ tar zxvf ../file.tar.gz file_b --to-command=cat 
file_b 
bbbb 
$ tar zxvf ../file.tar.gz file_a --to-command=cat 
file_a 
aaaa 
$ ls <== Even after tar extract - no files in directory. So, no changes to disk 
$ tar --version 
tar (GNU tar) 1.25 
... 
$ 
Cuestiones relacionadas