A maneira mais rápida de compactar (ou seja, arquivar em um único arquivo) milhões de arquivos pequenos em um cluster poderoso para acelerar a transferência de arquivos

2

NOTA IMPORTANTE: A compactação NÃO é a meta, arquivar / gravar (agrupar todos os arquivos em um único arquivo) é o objetivo.

Eu quero fazer backup de um único diretório, que contém centenas de subdiretórios e milhões de arquivos pequenos (< 800 KB). Ao usar rsync para copiar esses arquivos de uma máquina para outra, notei que a velocidade de transferência é dolorosamente baixa, apenas em torno de 1 MB / seg, enquanto quando copio arquivos enormes (por exemplo, 500 GB) a transferência taxa é de fato em torno de 120 MB / seg. Portanto, a conexão de rede não é o problema.

Nesse caso, mover apenas 200 GB desses arquivos pequenos me levou cerca de 40 horas. Então, estou pensando em compactar todo o diretório que contém esses arquivos e, em seguida, transferir o arquivo compactado para a máquina remota, depois descompactando-o na máquina remota. Eu não estou esperando que essa abordagem reduza de 40 horas para 5 horas, mas eu suspeito que definitivamente levaria menos de 40 horas.

Tenho acesso a um cluster com 14 núcleos de CPU (56 encadeamentos - CPU Intel (X) Xeon (R) Gold 5120 a 2.20GHz) e 128 GB de RAM. Portanto, a energia da CPU / RAM não é um problema.

Mas qual é a maneira mais rápida e eficiente de criar um único arquivo com tantos arquivos? Atualmente, só conheço essas abordagens:

  • tradicional tar.gz approach
  • 7zip
  • pigz (gzip paralelo - link )

No entanto, não sei qual é mais rápido e como os parâmetros devem ser ajustados para atingir a velocidade máxima? (por exemplo, é melhor usar todos os núcleos do processador com 7zip ou apenas um?)

N.B. O tamanho do arquivo e a taxa de compactação NÃO são importantes . Eu não estou tentando economizar espaço em tudo. Estou apenas tentando criar um único arquivo de tantos arquivos para que a taxa de transferência seja de 120 MB / s em vez de 1 MB / s.

RELACIONADO : Como tornar o 7-Zip mais rápido

    
por vivoru 13.07.2018 / 10:07

1 resposta

2

Use tar , mas renuncie à parte gzipante. O objetivo do TAR é converter arquivos em um único fluxo (significa arquivo de fitas). Dependendo do seu processo, você poderia gravar o fluxo em um disco e copiá-lo, mas, com mais eficiência, você poderia canalizá-lo (por exemplo, via SSH) para a outra máquina - possivelmente descompactando-o ao mesmo tempo.

Como o processo é IO e não um uso intensivo da CPU, a parelelização do processo não ajudará muito, se for o caso. Você reduzirá o tamanho da transferência de arquivos (se os arquivos não forem exatamente divisíveis por tamanho de bloco), e você economizará muito por não ter o back-and-forward para negociar cada arquivo.

Para criar um arquivo tar descompactado:

tar -cf file.name /path/to/files

Para transmitir pela rede:

tar -c /path/to/files | ssh [email protected] 'cd /dest/dir && tar -x'

Nota: Se estiver escrevendo um arquivo intermediário em um disco rígido como no exemplo 1, pode ser mais rápido gzipar o arquivo se houver uma quantidade razoável de compactação, pois isso reduzirá a quantidade a ser gravada no disco, que é o pare lento do processo.

    
por 13.07.2018 / 10:44

Tags