tarring em paralelo

5

Um amigo do Oceanographer no trabalho precisa fazer backup de muitos meses de dados. Ela está sobrecarregada, então eu me ofereci para fazê-lo. Existem centenas de diretórios para fazer o backup e queremos tar / bzip-los em arquivos com o mesmo nome que o diretório. Eu posso fazer isso fácil o suficiente em série - mas - eu queria aproveitar as várias centenas de núcleos na minha estação de trabalho.

Pergunta: usando o find com o -n -P args ou o GNU Parallel, como tar / bzip os diretórios, usando o máximo de núcleos possível enquanto nomeao o produto final: origonalDirName.tar.bz2 ?

Eu usei o find para fazer o bunzip de 100 arquivos simultaneamente e foi MUITO rápido - então esta é a maneira de abordar o problema, embora eu não saiba como obter cada nome de arquivo para cada diretório.

    
por Peter 20.07.2015 / 22:22

3 respostas

6

Apenas tar to stdout e canalizar para pigz . (Você provavelmente não quer paralelizar o acesso ao disco, apenas a parte de compressão):

$ tar c- myDirectory/ | pigz > myDirectory.tar.gz

Uma invocação simples de tar , como a acima, basicamente concatena as árvores de diretórios de maneira reversível. A parte de compactação pode ser separada, como neste exemplo.

pigz faz compactação multithread. O número de encadeamentos que ele usa pode ser ajustado com -p e o padrão será o número de núcleos disponíveis.

    
por 20.07.2015 / 22:43
1

O pbzip2 funciona muito bem. Como na resposta acima, tar para stdout e pipe para pbzip2:

$ tar -cf - mydir/ | pbzip2 > mydir.tar.bz2

O pbzip2 aceita várias opções que permitem ajustar o número de processadores, a quantidade de memória usada, o nível de compactação, etc.

link

Ou para um arquivo por diretório (não assume espaços ou caracteres especiais em nomes de diretório):

for dir in * ; do 
     [[ ! -d ${dir} ]] && continue
     tar cf -  ${dir} | bzip2 > ${dir}.tar.bz2 &
done
    
por 21.07.2015 / 02:33
0

Com o GNU Parallel, é assim:

parallel tar jcvf /tmp/{= s:/$:: =}.tar.bz2 {} ::: */

ou:

parallel tar jcvf /tmp/{}.tar.bz2 {} ::: *

Para uma melhor compactação, tente:

parallel tar -I pxz -cvf /tmp/{= s:/$:: =}.tar.xz {} ::: */
    
por 22.07.2015 / 16:57