¿Hay un archivador de archivos paralelo (como tar)?

40

¿Hay algo por ahí para el archivo paralelo de archivos?

Tar es genial, pero no uso archivos de cinta, y es más importante para mí que el archivo se realice rápidamente (con compresión como bzip2) ya que tengo smp.

supercheetah
fuente
77
tar es para algo más que cintas. El nombre originalmente provenía de la cinta, pero en estos días veo que se usa principalmente para cuando quieres poner cosas en un solo archivo para su redistribución mientras se mantiene la información de la estructura del directorio con compresión opcional.
Kevin M
hay bastantes herramientas de compresión paralelas comparadas aquí vbtechsupport.com/1614, sin embargo, aún no hemos encontrado una versión paralela de tar
p4guru
Ninguna de las respuestas proporcionadas (incluida la aceptada) maneja directorios , por lo que puedo decir, manejan archivos . Solo veo zipque puedo manejar directorios: |
warren
1
En realidad, lo que solemos hacer es empaquetar los directorios de tararchivos, y luego comprimir el paquete mediante un compresor de archivos (como gzip, pigz, etc.). Puede hacerlo en dos pasos, pero también en un solo paso , ya que pueden trabajar en flujos de datos desde la entrada / salida estándar. Los resultados son muy similares zip, pero más versátiles.
gerlos

Respuestas:

36

Creo que estás buscando pbzip2:

PBZIP2 es una implementación paralela del compresor de archivos de clasificación de bloques bzip2 que utiliza pthreads y logra una aceleración casi lineal en máquinas SMP.

Eche un vistazo a la página de inicio del proyecto o consulte su repositorio de paquetes favorito.

echox
fuente
1
También puede probar pigzy pxzpara implementaciones paralelas de gzipy xz. Puede comprimir usando un comando como tar c dir | pigz -c > dir.tar.gzy descomprimir usando pigz -cd dir.tar.gz | tar xf -.
gerlos
3
Los comandos de hoy serían tar -cf dir.tar.gz -I pigz diry tar -xf dir.tar.gz -I pigz. También xzestá roscado: uso XZ_OPT=-T0 tar -cJf dir.tar.gz diry XZ_OPT=-T0 tar -xJf dir.tar.gz.
Rico
21

7zip puede ejecutarse en múltiples subprocesos cuando se le da la -mmtbandera, pero solo cuando se comprime en archivos 7z, que ofrecen una gran compresión pero generalmente son más lentos que zip para crear archivos. Haz algo como esto:

7z a -mmt foo.7z /opt/myhugefile.dat
fschmitt
fuente
7z es un buen archivador, con un buen soporte para controlar las compensaciones entre la relación de compresión y el tiempo de compilación / descomposición, acceso aleatorio frente a una mejor compresión, y cosas así. Sin embargo, no almacena casi tantos metadatos como alquitrán, pierde propietario / permisos.
Peter Cordes
Parece que esta opción está activada de forma predeterminada: al menos no tengo un aumento en el rendimiento y la salida de 7z tiene una línea sobre la cantidad de núcleos de mi CPU en ambos casos.
Andrey Starodubtsev
14

El OP preguntó sobre el archivo paralelo, no la compresión paralela.

Si el material fuente proviene de un sistema de archivos donde diferentes directorios / archivos pueden estar en diferentes discos, o incluso un solo disco rápido que excede la velocidad de entrada de las herramientas de compresión, entonces podría ser beneficioso tener múltiples flujos de entrada entrando en las capas de compresión.

La pregunta significativa es, ¿cómo se ve la salida de un archivo paralelo? Ya no es solo un descriptor de archivo único stdout, sino un descriptor de archivo por hilo.

Un ejemplo de esto hasta ahora es el modo de volcado paralelo de Postgresql pg_dump, en el que volca a un directorio, con subprocesos trabajando sobre el conjunto de tablas para hacer una copia de seguridad (cola de trabajo con múltiples subprocesos que consumen la cola).

No estoy seguro de ningún archivador paralelo real que sea convencional. Hubo un truco para Solaris Tar para su uso en ZFS: http://www.maier-komor.de/mtwrite.html

Hay algunas herramientas de copia de seguridad dedicadas que ejecutan con éxito múltiples subprocesos, pero muchas más que solo dividen la carga de trabajo por directorio a un alto nivel.

robbat2
fuente
11
tar --use-compress-program=pigz  ....

reemplace pigzcon su programa de compresión paralela favorito. La razón para usar tares porque puede almacenar el propietario, el grupo y los permisos. Esos metadatos suelen ser útiles (por ejemplo, restaurar un árbol de directorios en un sistema complejo).

uDude
fuente
44
tar -c --use-compress-program = pigz -f myDirectory.tar.gz myDirectory /
markusN
1
Todas las opciones, AFAIK, para alquitrán se pueden usar normalmente junto con la -Iopción, que es la misma que --use-compress-program. Entonces, por ejemplo, tar cvzf /some/dir/yournewarchive.tar.gz /directory/tobecompressed --exclude="/directo...."se puede aplicar a la opción de subprocesos múltiples utilizando pigzcomo tar -I pigz -cvf /some/dir/yournewarchive.tar.gz /directory/tobecompressed --exclude="/directo...". Esta es la mejor respuesta, la más apropiada, en mi humilde opinión. Gracias @ uDude! :)
ILMostro_7
10

pigz es una implementación paralela de gzip, pero solo puede usar múltiples procesadores para la compresión, no para la descompresión.

Jay Hacker
fuente
2
Hice algunos experimentos, y en pigzrealidad parece ser capaz de usar múltiples hilos también cuando se descomprime. Intente comparar la salida de time tar xf dir.tar.gzy de time pigz -cd dir.tar.gz | tar xf -(en mi CPU de 4 núcleos, toma un poco menos de la mitad del tiempo).
gerlos
44
@gerlos Usar timeen una tubería solo cronometrará el primer comando. De la pigzdocumentación : "La descompresión no puede ser paralelizada, al menos no sin flujos de desinflado especialmente preparados para ese propósito. Como resultado, pigz usa un solo hilo (el hilo principal) para la descompresión, pero creará otros tres hilos para leer, escribir y verificar el cálculo, lo que puede acelerar la descompresión en algunas circunstancias ".
augurar el
1
También hay pixz .
Marc.2377
8

tares simplemente un formato de archivo que es muy bueno para duplicar exactamente los archivos y preservar el árbol de directorios y los atributos del archivo original. TAR es muy bueno para hacer copias de seguridad, porque todo está preservado. Utilizo pbzip2para comprimir los archivos tar que utilizo para las copias de seguridad del sistema con muy buenos resultados.

Este comando debería hacer el truco.

tar -cpS "infile" | pbzip2 > "outfile"

pbzip2 se puede reemplazar con una utilidad de compresión diferente, pero tenga en cuenta que la compresión LZMA (como pxz) usa una TONELADA de RAM al comprimir / descomprimir archivos grandes (intenté ejecutar 8 hilos con 8GB de RAM, y pxz comenzó a cambiar al disco).

lovot
fuente
4

Otro contendiente es lbzip2. Es bastante similar a pbzip2

Felipe Alvarez
fuente
1

En lo que respecta a la compresión, xzya que aproximadamente la versión 5.2 admite la compresión paralela a través de la -Topción.

Peterph
fuente