Como diferenciar arquivos grandes no Linux

27

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

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

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

Alguma idéia além de dividir o arquivo em partes menores? Eu tenho 40 desses arquivos tentando evitar o trabalho de quebrá-los.

    
por Tom B 10.08.2010 / 17:52

3 respostas

10

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

Aparte: Caso alguém mais entre 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 -q para breve, ou talvez diff -rq ) funcionará e não ficará sem memória.

    
por 19.12.2013 / 18:25
6

Eu encontrei este link

diff -H might help, or you can try installing the textproc/2bsd-diff port which apparently doesn't try to load the files into RAM, so it can work on large files more easily.

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

    
por 11.08.2010 / 17:24
1

Se os arquivos forem idênticos (mesmo tamanho), exceto por alguns valores de byte, você pode usar um script como o seguinte ( w é o número de bytes por linha para hexdump, ajuste a largura de exibição):

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.

    
por 02.02.2013 / 19:49

Tags