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

15

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

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

A melhor solução é enviar os arquivos por correio tradicional?

oshirowanen
fonte
9
Você está tendo problemas para CRIAR .tar.gzou COPIAR o arquivo compactado resultante? De qualquer maneira, algo é estranho, porque nenhuma operação deve consumir mais memória apenas porque os arquivos são grandes. Ou seja, ambas as operações devem estar em fluxo contínuo. Por favor, inclua mais informações sobre exatamente quais comandos estão falhando.
Celada
1
Quanta largura de banda você e terceiros têm de sobra? Um rsync ingênuo pode economizar em postagem. Mas não sei como "cinco milhões" de arquivos funcionarão para você, porque o rsync tentará criar a lista de arquivos na memória e poderá listar (arquivos 5e6)> 8 GB. E é claro que será lento.
precisa
2
@oshirowanen Não acho que deva consumir muita memória computando a lista de arquivos, porque tenho certeza de que tardeve arquivar arquivos de forma incremental conforme a lista, nunca criando uma lista na memória. Mas, novamente, por favor, mostre o comando exato que você está usando. Além disso, todos os arquivos estão no mesmo diretório ou a estrutura de diretórios é muito profunda?
Celada
3
Ah, sim, bem, os programas de GUI geralmente são criados sem dar muita importância a objetivos como escalabilidade e robustez. Não me surpreenderia se a culpa fosse do wrapper / front-end da GUI. Crie o arquivo usando a linha de comando e acho que você descobrirá que ele funciona bem.
Celada
3
1 TB de dados levará pelo menos 22 horas para transferir em uma conexão de banda larga de 100 Mbit / s. Portanto, dependendo da quantidade de compactação que você espera obter, o correio tradicional pode ser a opção mais rápida.
Dan

Respostas:

27

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

O software da GUI geralmente inclui muito mais inchaço do que o software equivalente da linha de comando equivalente ou executa tarefas desnecessárias adicionais em prol 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. Não é necessário fazer isso para criar um arquivo. As ferramentas dedicadas tare gzipsão definitivamente projetado para trabalhar com streaming de entrada e saída que significa que eles podem lidar com entrada e saída muito maior do que a memória.

Se você evitar o programa GUI, provavelmente poderá gerar esse archive usando uma tarchamada diária completamente normal como esta:

tar czf foo.tar.gz foo

Onde fooestá o diretório que contém todos os seus 5 milhões de arquivos.

As outras respostas a esta pergunta oferecem alguns tarcomandos alternativos adicionais para tentar, caso você queira dividir o resultado em várias partes, etc ...

Celada
fonte
15

"cinco milhões" de arquivos e 1 TB 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 tiver isso - ou o seu caso de uso não permitir rsync, eu pelo menos verificaria se 7zfunciona com seus dados. Pode não ser, mas acho que ainda vale a pena tentar:

7z a archive.7z /source/dir

Ou se você não se sentir confortável com 7zpelo menos tente criar um .tar.xzarquivo:

tar cJv archive.tar.xz /source/dir

(deve-se observar que as versões mais antigas de tarnão criam .tar.xzarquivos, mas os .tar.lzmaarquivos ao usar a Jopção. Mesmo as versões mais antigas tarnão suportam Jtotalmente o sinalizador.)


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

Para facilitar a criação, gerenciamento e extração de arquivos da interface da linha de comandos, existe o pequeno utilitário chamado atool. Está disponível para praticamente todas as distribuições comuns que eu já vi e funciona praticamente em todos os arquivos que encontrei, a menos que sejam irremediavelmente obscuros.

Verifique se sua distribuição tem atoolem seus repositórios ou peça ao seu administrador para instalá-la, quando estiver em um ambiente de trabalho.

atool instala um monte de links simbólicos para si mesmo; portanto, empacotar e descompactar se torna fácil:

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

Cria um arquivo.

aunpack archive.7z

Expande o arquivo.

als archive.rar

Lista o conteúdo do arquivo.

Que tipo de arquivo é criado, atooldiscerne que pela extensão de nome de seu arquivo na linha de comando.

polemon
fonte
4
A vantagem de usar aqui rsyncé que, se (quando) a conexão for interrompida, ela rsyncpoderá continuar de onde parou.
roaima
2
Os arquivos teriam uma média de 200 KB. Isso não é tão pequeno assim.
Nate Eldredge
4
@NateEldredge Normalmente, penso em grande como significando> 1 GB. Pequeno é geralmente <1 MB. Tão bem pequeno.
PythonNut
8

A menos que você possa fazer uma compactação melhor que 25: 1, é improvável que você ganhe algo ao compactá-la antes do envio direto, a menos que você tenha algum formato de fita de hardware que possa trocar com terceiros.

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

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

Você só precisa comparar isso com o uso ssh -C(compactação padrão) ou, de preferência, rsynccom compactação para copiar os arquivos pela rede, sem necessidade de compactar e tar com antecedência. 1 TB não é impossível passar pela rede, mas vai demorar um pouco.

Anthon
fonte
5
+1: "nunca subestime a largura de banda de uma caminhonete cheia de fitas rolando pela estrada" (Andrew S. Tanenbaum). veja en.wikipedia.org/wiki/Sneakernet
Olivier Dulac
@OlivierDulac Vi construções semelhantes com o Boeing 747 e caixas cheias de CDROMs. É incrível que tipo de rendimento você pode obter com isso.
Anthon
Eu amo que um pidgin bater um ISP por um tiro longo, consulte exemples da página da Wikipedia ^^
Olivier Dulac
6

Você considerou torrent? Ponto a ponto pode ser a melhor opção para uma transferência pela Internet:

  • Pelo menos tão rápido quanto outras transferências da 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 de armazenamento local / na nuvem
  • Livre

Você não disse qual sistema operacional estava usando, mas como você está falando sobre a compactação tar.gz, presumo que você esteja usando algum sistema operacional semelhante ao GNU / Linux. Por isso, sugiro Transmissão . É um software de torrent de código aberto que roda em Mac e Linux. Gosto porque os desenvolvedores se esforçam para torná-lo nativo para todos os clientes GUI que eles suportam: sem linguagem de plataforma cruzada.

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

LaX
fonte
O software Torrent provavelmente tem os mesmos problemas ao compactar o software GUI. Armazenando nomes de arquivos na memória, etc. Além disso, os arquivos torrent precisam armazenar os metadados dos arquivos. 5 milhões de nomes de arquivos devem ser compactados no arquivo torrent.
Ayesh K
@AyeshK True, isso afetará o desempenho ao adicionar / criar o torrent ou verificar somas de verificação. Ainda assim, acredito que esta é a solução mais estável para transferência de grande quantidade de dados.
LaX
De acordo com o torrent freak, o maior torrent já compartilhado é de ~ 800gb. Arquivo torrent único com a maioria dos arquivos contidos em arquivos de 33K. Mas 5 milhões de arquivos ... não tenho certeza.
Ayesh K
3

7z seria minha escolha. Permite a divisão automática de arquivos e suporta compactação multithread. Não, xznão, apesar do que a mensagem de ajuda diz. Tente com:

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

A saída é dividida em blocos de 100 MB (altere-a com o -vcomutador).

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 a tarsaída para o 7zacanal (veja man 7zaalguns exemplos).

Stefano Sanfilippo
fonte
1
The only real downsidemas que desvantagem!
njzk2
@ njzk2 na verdade, depende do cenário. Por exemplo, se você estiver enviando imagens de backup ou despejos de banco de dados, provavelmente não se importa muito com permissões.
Stefano Sanfilippo
Não vejo o ponto de usar o 7z para dividir, quando você pode usar splitem um arquivo .tar.gz e manter os metadados.
Njzk2 12/06
@ njzk2 também divide. Principalmente, ele possui compressão multiencadeada com LZMA2. Nenhum outro utilitário unix que eu conheça suporta isso. O 7z também possui um modo de compactação não sólido, que é um grande avanço quando apenas um arquivo específico precisa ser acessado por meio da tarabordagem.
Stefano Sanfilippo
3

Clique com o botão direito do mouse na pasta, clique em "criar arquivo" e selecione a opção .tar.gz. A estrutura de diretórios é profunda, mais de 500.000 diretórios

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

Eu vejo duas possibilidades:

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

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

Paulo
fonte
1
XKCD obrigatório .
PythonNut
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 de tamanho. Mas isso não responderia ao seu problema "OOM", uma vez que o tar deve transmitir sua leitura / gravação, de modo que o gargalo é óbvio.

mveroone
fonte
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 zmorto e grava no stdout, compacta o fluxo
  • ssh remotehost entre no host remoto usando ssh
  • cd /target/dir/ mude para o diretório de destino
  • tar xzf - extrair o fluxo de entrada de stdin
caos
fonte
Bom pequeno trecho. Embora eu acho que sua necessidade aqui é o recurso de compressão em sua maioria, já que o objetivo é "transferência para um amigo"
mveroone
A não criação completa do arquivo será prejudicada quando a conexão for interrompida, o que não é totalmente improvável durante a transferência de 1 TB, devido à falta de rede (ainda existem ISPs que desconectam você a cada 24 horas) ou por outros motivos.
Jonas Schäfer