Como diferenciar arquivos grandes no Linux

31

Estou recebendo um diff: memory exhaustederro ao tentar diferenciar dois arquivos de 27 GB que são amplamente semelhantes em uma caixa Linux com CentOS 5 e 4 GB de RAM. Este é um problema conhecido, ao que parece.

Eu esperava que houvesse uma alternativa para um utilitário tão essencial, mas não consigo encontrar um. Eu imagino que a solução precisaria usar arquivos temporários em vez de memória para armazenar as informações necessárias.

  • Tentei usar rdiffe xdelta, mas eles são melhores para mostrar as alterações entre dois arquivos, como um patch, e não são úteis para inspecionar as diferenças entre dois arquivos.
  • Tentei o VBinDiff , mas é uma ferramenta visual que é melhor para comparar arquivos binários. Eu preciso de algo que possa canalizar as diferenças para STDOUT como regular diff.
  • Existem muitos outros utilitários, como esse, vimdiffque funcionam apenas com arquivos menores.
  • Também li sobre o Solaris, bdiffmas não consegui encontrar uma porta para Linux.

Alguma idéia além de dividir o arquivo em pedaços menores? Eu tenho 40 desses arquivos, tentando evitar o trabalho de desmembrá-los.

Tom B
fonte
qual versão do xdelta você tentou? xdelta3 ou xdelta1?
nmuntz
Foi a versão 1.1.4. O xdelta3 fornece funcionalidade diferente? Acabei de verificar o documento on-line e ainda parece ser sobre o fornecimento de "deltas".
Tom B
Veja também esta resposta: unix.stackexchange.com/a/77259/27186
unhammer

Respostas:

12

cmpfaz coisas byte a byte, então provavelmente não ficará sem memória (apenas testei em dois arquivos de 7 GB) - mas você pode estar procurando mais detalhes do que uma lista de "arquivos X e Y diferem em byte x , linha y ". Se as semelhanças dos seus arquivos forem deslocadas (por exemplo, o arquivo Y tiver um bloco de texto idêntico, mas não no mesmo local), você poderá passar compensações para cmp; você provavelmente poderia transformá-lo em uma comparação ressincronizada com um pequeno script.

Além disso: caso mais alguém chegue aqui ao procurar uma maneira de confirmar que duas estruturas de diretório (contendo arquivos muito grandes) são idênticas: diff --recursive --brief(ou diff -r -qabreviado, ou talvez até diff -rq) funcionará e não ficará sem memória.

Felix
fonte
nice, I think -q is the key here, somehow not having it can require diff to put the whole file (or at least whole lines) into memory...
rogerdpack
7

Eu encontrei este link

O diff -H pode ajudar, ou você pode tentar instalar a porta textproc / 2bsd-diff que aparentemente não tenta carregar os arquivos na RAM, para que ele possa trabalhar em arquivos grandes com mais facilidade.

Não sei se você tentou essas duas opções ou se elas podem funcionar para você. Boa sorte.

Jarvin
fonte
1
Isso ajuda a alguém por aí? Para mim, o mesmo fracasso ...
rogerdpack
12
Para quem se pergunta: diff -Hé um alias indocumentado e obsoleto para diff --speed-large-files.
a3nm
1
Esta resposta não ajuda. Esta é uma questão do Linux, e para instalar o 2bsd-diff você precisaria portá-lo primeiro. Depois de encontrar uma fonte . E remendou . Possível, mas improvável, uma solução viável.
nyov 27/08
1

Se os arquivos forem idênticos (mesmo comprimento), exceto por alguns valores de bytes, você poderá usar um script como o seguinte ( wé o número de bytes por linha do hexdump, ajuste a largura da tela):

w=12;
while read -ru7 x && read -ru8 y;
do
  [ ".$x" = ".$y" ] || echo "$x | $y";
done 7< <(od -vw$w -tx1z FILE1) 8< <(od -vw$w -tx1z FILE2) > DIFF-FILE1-FILE2 &

less DIFF-FILE1-FILE2

Não é muito rápido, mas faz o trabalho.

Tino
fonte