2011-07-06 21 views
10

Estoy tratando de combinar muchos archivos ordenados en un script de UNIX/Linux con sort -m, y noté que sort primero escribe el resultado en un archivo temporal y luego lo copia en el destino. Mi comprensión de -m fue que asume que los archivos están ordenados, por lo que usar un archivo temporal es completamente innecesario, y desperdicia tanto espacio en el disco duro y ciclos de CPU (estoy usando sort en una tubería que se bloquea esperando a que la clase genere algo .) ¿Hay alguna forma de decirle al sort que no use archivos temporales al combinar archivos ordenados? O una mejor versión que no?Cómo combinar archivos ordenados sin usar un archivo temporal?

La CL exacta parece:

$ sort -m -s -t '_' -k 1,1n -k 2,2n <(gunzip <file_1) [...] <(gunzip <file_n) | gzip >output 

estoy usando sort de GNU coreutils 5,97.

+0

creo porque 'sort' fue escrito como una utilidad de propósito general, no consideraron su caso como algo que añadir más complejidad al programa y así confiar en el mecanismo de tipo de enfermedad de transmisión sexual tmp archivos. .... Sería muy fácil escribir un script awk que recorre tu lista de archivos de entrada, compara cada 1ª línea, imprime el valor "más bajo" de un archivo, obtiene el siguiente registro de ese archivo, luego compara todo el registra nuevamente, buscando imprimir el siguiente registro 'más bajo'. Puede encontrar un límite de sistema en el archivo abierto, pero esto sería cierto para cualquier solución que codifique. prueba 4 ese primero. Buena suerte – shellter

Respuesta

3

Echa un vistazo a estas opciones desde man sort, te pueden dejar minimizar la cantidad de espacio necesario para fusionar.

--batch-size=NMERGE 

fusionar como máximo las entradas de NMERGE a la vez; para más uso archivos temporales

--compress-program=PROG 

comprime los temporales con PROG; descomprimirlos con PROG -d

+0

Esta no es una solución a la pregunta, ya que se preguntó cómo evitar archivos temporales y por qué se necesitan archivos temporales. Su respuesta ayuda a reducir archivos temporales, pero no los previene. Para archivos grandes, aún usa archivos temporales – user890739

+1

Resuelve el problema. Tienes que establecer el '--batch-size' más alto que el número de archivos que deseas fusionar. Tenía 31 archivos para combinar y sin especificar esa opción, comenzó a usar un archivo temporal. Al configurar '--batch-size = 31', comenzó a escribir la salida de inmediato sin un archivo temporal. – fatlasercat

0

Corriendo con GNU coreutils 6.10, no estoy viendo ese problema.

Una cosa acerca de la línea de comandos que está utilizando es que la redirección < (...) escribe la entrada en un archivo temporal antes de iniciar el comando. ¿Podría ser esa la demora que estás viendo?

que corrió este comando:

sort -m a b c d e f g h i j | more 

y no creó un archivo temporal para la salida. Conecté la salida a más para bloquearla y luego miré en/proc para ver qué tipo estaba haciendo. Tenía todos los archivos de entrada abiertos, y el conducto para el comando más, pero eso era todo. Ningún archivo temporal:

$ ls -l /proc/1308/fd 
total 0 
lrwx------ 1 brianb brianb 64 2014-06-24 18:50 0 -> /dev/pts/0 
l-wx------ 1 brianb brianb 64 2014-06-24 18:50 1 -> pipe:[217016034] 
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 10 -> /home/brianb/h 
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 11 -> /home/brianb/i 
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 12 -> /home/brianb/j 
lrwx------ 1 brianb brianb 64 2014-06-24 18:50 2 -> /dev/pts/0 
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 3 -> /home/brianb/a 
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 4 -> /home/brianb/b 
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 5 -> /home/brianb/c 
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 6 -> /home/brianb/d 
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 7 -> /home/brianb/e 
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 8 -> /home/brianb/f 
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 9 -> /home/brianb/g 
Cuestiones relacionadas