Múltiplos processos tar gravando no mesmo arquivo de uma só vez

6

Estou executando muitas tarefas em um cluster do Linux. Cada tarefa cria muitos arquivos de saída. Quando todas as tarefas terminarem, executo algo como tar cf foo.tar output_files/ para criar um arquivo tar . Este é um processo muito lento, pois existem milhares de arquivos e diretórios.

Existe alguma maneira de fazer isso em paralelo, como os arquivos de saída estão sendo criados?

É possível ter vários processos tar , espalhados por várias máquinas, todos adicionando seus arquivos ao mesmo arquivo de uma só vez?

O cluster tem um sistema de arquivos compartilhado.

Não estou interessado em compactação, pois isso atrasa ainda mais as coisas e porque todos os arquivos de entrada já estão compactados. Idealmente, a saída seria um arquivo tar , mas eu consideraria outros formatos de arquivo também.

    
por Jeff Schaller 01.07.2014 / 00:56

3 respostas

5

Você não pode ter vários processos adicionando ao mesmo arquivo tar (ou qualquer outro formato de arquivo usual, compactado ou não). Cada arquivo é armazenado de forma contígua e não há como inserir dados em um arquivo, apenas para anexar ou sobrescrever, portanto, continuar gravando em um arquivo que não seja o último substituiria os arquivos subsequentes.

Se você souber o tamanho do arquivo antecipadamente, poderá reservar o tamanho no arquivo tar e manter o programa escrito. Isso exigiria muita codificação: é uma coisa muito incomum de se fazer.

O Unix tem um recurso projetado para acomodar um grupo de arquivos que são gravados de forma independente. É chamado de diretório.

Existem muito poucos casos em que você ganha algo de um arquivo descompactado em um diretório. A leitura pode ser um pouco mais rápida em algumas circunstâncias; isso é uma conseqüência intrínseca do formato de diretório (onde cada entrada de arquivo é um ponteiro para seu conteúdo) em oposição ao formato de arquivo (onde cada entrada de arquivo é seu conteúdo diretamente), que é precisamente o que torna possível construir o diretório por partes . Transformar uma árvore de diretórios em um arquivo é o pós-processamento que precisa ser feito seqüencialmente.

    
por 01.07.2014 / 01:26
3

Você pode iniciar a criação do arquivo tar final antes que todos os arquivos de saída sejam criados: Talvez isso alcance a velocidade desejada.

Você pode chamar o tar dessa maneira:

tar -cf foo.tar -T file-list

file-list seria um FIFO. Você precisa de um script que detecte

  1. novos arquivos no diretório de origem ( inotifywatch )

  2. quando cada um desses novos arquivos for concluído ( fuser )

Se um arquivo for concluído, seu caminho será gravado no FIFO. Talvez seja útil não criar um arquivo com caminhos completamente mistos. Você pode começar com o diretório que obtém o primeiro arquivo de entrada e adicionar novos diretórios somente após o último arquivo ter sido finalizado (criar um arquivo de sinalização após o término do respectivo processo). A primeira abordagem tem a vantagem de que provavelmente o arquivo está completamente no cache ainda.

    
por 01.07.2014 / 01:41
0

O GNU tar tem --append:

tar -f foo.tar --append newfiles

Infelizmente, ele lê o arquivo tar completo.

    
por 01.07.2014 / 03:53