Todos esses comandos: tar
, bzip2
e gpg
funcionam de maneira semelhante a um fluxo: eles pegam um dado (digamos um megabyte), o transformam e o empurram para o próximo estágio. Depois disso, a RAM é reutilizada para cuidar de outro bloco de dados. Portanto, mesmo que você tenha um terabyte de dados para processar, ele será processado, peça por peça.
Agora, quando você chamar tar
sozinho, o tar funcionará assim: leia um fragmento de dados do disco, envolva-o com alguns cabeçalhos necessários para o arquivamento, empurre-o para o disco e esqueça-o. E de novo. E de novo. Nesse processo, você nunca precisará de mais de um fragmento de dados na RAM. Não sei quão grande será o tar
s buffer, mas provavelmente será apenas alguns megabytes. Então, você precisará de apenas alguns megabytes de RAM para que funcione.
gpg
e bzip2
funcionam da mesma maneira. gpg
pega um pequeno pedaço de dados, criptografa e avança - tudo em um loop. bzip2
pega uma pequena quantidade de dados, compacta e avança - tudo em um loop.
Você precisará de menos RAM se chamar esses comandos sem um pipeline: você precisará manter apenas um bloco de dados ao mesmo tempo na RAM. Com um pipeline, pedaços de dados serão passados de um comando para outro, mantendo-os na RAM: você precisará de alguns fragmentos de dados: um para tar
, um para gpg
, um para bzip2
. Então, vários megabytes no máximo. Você não precisará de RAM para armazenar todos os dados de uma só vez.
Com o pipelining, você pode obter outro benefício: velocidade. Você não precisa armazenar dados temporários no disco. Pedaços de dados são passados de tar
para bzip2
e de bzip2
para gpg
usando apenas RAM. Compare: 3 GB de dados, 3 GB de dados em um arquivo tar, 1 GB de dados em um arquivo tar.bzip2, 1 GB de dados em um arquivo tar.bzip2.gpg. Mesmo que você não os armazene ao mesmo tempo (por exemplo, removendo arquivos de origem no processo), ainda é necessário gravar e ler mais 4 GB de dados no disco do que em uma versão de pipeline. E os VPSs geralmente são muito lentos nas operações de disco, portanto, um pipeline pode poupar muito tempo.
(Nota: esta explicação é simplificada. Todos esses comandos mantêm alguns dados adicionais na RAM, mas isso raramente é significativo. Além disso, você pode alterar o tamanho dos buffers em comandos específicos.)