Problemas de memória ao compactar e transferir um grande número de arquivos pequenos (1TB no total)

14

Eu tenho 5 milhões de arquivos que ocupam cerca de 1 TB de espaço de armazenamento. Eu preciso transferir esses arquivos para terceiros.

Qual é a melhor maneira de fazer isso? Eu tentei reduzir o tamanho usando .tar.gz, mas mesmo que meu computador tenha 8GB de RAM, recebo um erro de "falta de memória do sistema".

A melhor solução para enviar os arquivos por e-mail é o correio?

    
por oshirowanen 12.06.2015 / 09:29

9 respostas

27

Informações adicionais fornecidas nos comentários revelam que o OP está usando um método GUI para criar o arquivo .tar.gz .

O software da GUI geralmente inclui muito mais inchaço do que o software equivalente da linha de comando equivalente, ou executa tarefas adicionais desnecessárias por causa de algum recurso "extra", como uma barra de progresso. Não me surpreenderia se o software da GUI estivesse tentando coletar uma lista de todos os nomes de arquivos na memória. É desnecessário fazer isso para criar um arquivo. As ferramentas dedicadas tar e gzip foram projetadas para funcionar com entrada e saída de streaming, o que significa que elas podem lidar com entradas e saídas muito maiores que a memória.

Se você evitar o programa da GUI, você pode muito provavelmente gerar este arquivo usando uma invocação de tar diária normal como esta:

tar czf foo.tar.gz foo

onde foo é o diretório que contém todos os seus 5 milhões de arquivos.

As outras respostas a esta questão dão-lhe alguns comandos tar alternativos adicionais para tentar caso queira dividir o resultado em várias partes, etc ...

    
por 12.06.2015 / 10:10
14

"cinco milhões" de arquivos e 1TB no total? Seus arquivos devem ser muito pequenos, então. Eu simplesmente tentaria rsync :

rsync -alPEmivvz /source/dir remote.host.tld:/base/dir

Se você não tem isso - ou seu caso de uso não permite o uso de rsync , eu pelo menos verifiquei se 7z trabalha com seus dados. Pode não ser, mas acho que vale a pena tentar:

7z a archive.7z /source/dir

Ou se você não se sentir à vontade com 7z , pelo menos tente criar um arquivo .tar.xz :

tar cJv archive.tar.xz /source/dir

(deve-se observar que as versões mais antigas de tar não criam .tar.xz archives, mas .tar.lzma archives, ao usar a opção J . Versões ainda mais antigas de tar , não suporta o J flag.)

Como você está usando um programa GUI para criar esses arquivos, presumo que esteja se sentindo um pouco desconfortável usando uma interface de linha de comando.

Para facilitar a criação, o gerenciamento e a extração de arquivos a partir da interface da linha de comando, há o pequeno utilitário chamado atool . Ele está disponível para praticamente todas as distros comuns que eu vi, e funciona praticamente todos os arquivos que eu encontrei, a menos que os obscuramente irremediavelmente obscuros.

Verifique se sua distro tem atool em seus repositórios ou peça ao seu administrador para instalá-lo, quando estiver em um ambiente de trabalho.

atool instala vários links simbólicos para si, para que o empacotamento e a descompactação sejam fáceis:

apack archive.tar.xz <files and/or directories>

Cria um arquivo.

aunpack archive.7z

Expande o arquivo.

als archive.rar

Relaciona o conteúdo do arquivo.

Que tipo de arquivo é criado, atool discerne isso pela extensão de nome de arquivo do seu arquivo na linha de comando.

    
por 12.06.2015 / 10:10
8

A menos que você possa fazer melhor do que a compressão 25: 1, é improvável que você ganhe qualquer coisa ao compactar isso antes do envio de correspondência, a menos que tenha algum formato de fita de hardware que você possa trocar por terceiros.

O maior armazenamento comum é o blue ray e isso te dará aproximadamente 40Gb. Você precisaria de 25 para 1 compactação em seus dados para ajustá-los. Se o seu terceiro tiver apenas DVD, você precisará de 125: 1 (aproximadamente).

Se você não puder corresponder esses números de compactação, apenas use um disco normal, copie e envie para o terceiro. Nesse caso, enviar algo menor que uma unidade de 1 TB que precisaria de compressão é uma loucura.

Você só precisa compará-lo a usar ssh -C (compactação padrão) ou preferencialmente rsync com compactação para copiar os arquivos pela rede, sem necessidade de comprimir e tarar com antecedência. 1Tb não é impossível passar pela rede, mas vai demorar um pouco.

    
por 12.06.2015 / 10:03
5

Você considerou torrente? O peer-to-peer pode ser sua melhor opção para uma transferência pela Internet:

  • Pelo menos, tão rápido quanto outras transferências pela internet: sua velocidade de upload determinará a velocidade de transferência
  • Sem corrupção de dados
  • Escolha quais arquivos transferir primeiro
  • Não é necessário espaço extra de armazenamento local / na nuvem
  • Gratuito

Você não disse qual SO estava usando, mas como está falando sobre compactação tar.gz, eu suponho que você está usando algum sistema operacional parecido com o GNU / Linux. Para isso, sugiro a Transmissão . É um software torrent de código aberto que roda em Mac e Linux. Eu gosto disso porque os desenvolvedores se esforçam para torná-lo nativo para todos os clientes de GUI que eles suportam: nenhuma linguagem multi-plataforma.

Você pode combinar esse método com a compactação, mas perderá a capacidade de priorizar partes da transferência.

    
por 12.06.2015 / 14:38
3

7z seria a minha escolha. Permite a divisão automática de arquivos e suporta a compressão multi-threaded. Não, xz não, apesar do que a mensagem de ajuda diz. Experimente com:

7za a -v100m -m0=lzma2 -mx=9 -ms=on -mmt=$THREADS archive.7z directory/

A saída é dividida em blocos de 100MB (altere-a com a opção -v ).

A única desvantagem real é que o 7z não retém metadados unix (por exemplo, permissões e proprietário). Se você precisar disso, envie pipe tar em 7za (consulte man 7za para alguns exemplos).

    
por 12.06.2015 / 15:25
3

I right clicked the folder and clicked "create archive" and selected the .tar.gz option. The directory structure is deep, over 500,000 directories

Sim, boa sorte em conseguir isso. E a ferramenta GUI tentará fazer isso no mesmo volume, o que significa: a) você precisa de mais 1Tb de espaço livre eb) a cabeça se debatendo de ler um arquivo e anexá-lo ao arquivo não será muito saudável para o disco.

Eu vejo duas possibilidades:

1) rsync do seu computador para o terceiro. Um ou outro precisará de um endereço IP global que não seja alterado com frequência. A vantagem enorme do rsync é se você for interrompido por qualquer motivo, ele pode continuar de onde parou. Copiar um tarball de 1Tb será bem-sucedido ou falhará

2) compre uma unidade externa de 1Tb, copie os itens para ela e envie a unidade. Alta latência, mas realmente boa largura de banda quando chega. Vários serviços de backup online para isso para o backup inicial.

    
por 12.06.2015 / 17:00
1

Eu sugiro que você use algo como:

tar -c -L 104857600 -f file1.tar -f file2.tar -f file3.tar -f file4.tar -f file5.tar -f file6.tar -f file7.tar -f file8.tar -f file9.tar -f file10.tar 
gzip file*.tar

que criará 10 arquivos com no máximo 100 GB. Mas isso não responderia ao seu problema de "OOM", já que o tar deve transmitir o que ele lê / escreve, então o gargalo é obviamente gzip.

    
por 12.06.2015 / 10:02
0

Que tal isso:

find /path | tar -T - -czf - | ssh remotehost "cd /target/dir/; tar xzf -"
  • find pesquisas lista a árvore de diretórios
  • tar -T - lê a lista de stdin
  • -czf - cria um arquivo e grava no stdout, z gzips o fluxo
  • ssh remotehost login para remotehost usando ssh
  • cd /target/dir/ muda para o diretório de destino
  • tar xzf - extrai o fluxo de entrada do stdin
por 12.06.2015 / 09:44
0

Com o fexsend você pode enviar arquivos de qualquer número e tamanho para qualquer destinatário on-the-fly, veja:

link

Claro, você precisa de um servidor F * EX, mas é gratuito:

link

    
por 10.02.2016 / 15:34