Comment différencier des fichiers volumineux sous Linux


31

Je reçois une diff: memory exhaustederreur lorsque j'essaie de différencier deux fichiers de 27 Go qui sont largement similaires sur une boîte Linux avec CentOS 5 et 4 Go de RAM. Il semble que ce soit un problème connu.

Je m'attendrais à ce qu'il y ait une alternative pour un utilitaire aussi essentiel, mais je n'en trouve pas. J'imagine que la solution devrait utiliser des fichiers temporaires plutôt que de la mémoire pour stocker les informations dont elle a besoin.

  • J'ai essayé d'utiliser rdiffet xdelta, mais ils sont meilleurs pour montrer les changements entre deux fichiers, comme un patch, et ne sont pas très utiles pour inspecter les différences entre deux fichiers.
  • J'ai essayé VBinDiff , mais c'est un outil visuel qui est meilleur pour comparer des fichiers binaires. J'ai besoin de quelque chose qui puisse transmettre les différences à STDOUT comme d'habitude diff.
  • Il existe de nombreux autres utilitaires tels que ceux vimdiffqui ne fonctionnent qu'avec des fichiers plus petits.
  • J'ai également lu sur Solaris bdiffmais je n'ai pas pu trouver de port pour Linux.

Des idées en plus de diviser le fichier en plus petits morceaux? J'ai 40 de ces fichiers, donc j'essaie d'éviter de les casser.


quelle version de xdelta avez-vous essayé? xdelta3 ou xdelta1?
nmuntz

C'était la version 1.1.4. Xdelta3 offre-t-il des fonctionnalités différentes? Je viens de vérifier le document en ligne et il semble toujours s'agir de fournir des "deltas".
Tom B


Voir aussi cette réponse: unix.stackexchange.com/a/77259/27186
unhammer

Réponses:


12

cmpfait les choses octet par octet, donc il ne manquera probablement pas de mémoire (venez de le tester sur deux fichiers de 7 Go) - mais vous cherchez peut-être plus de détails qu'une liste de "fichiers X et Y diffèrent d'un octet x , ligne y ". Si les similitudes de vos fichiers sont décalées (par exemple, le fichier Y a un bloc de texte identique, mais pas au même emplacement), vous pouvez passer des décalages à cmp; vous pourriez probablement en faire une comparaison de resynchronisation avec un petit script.

En plus: Au cas où quelqu'un d'autre atterrirait ici en cherchant un moyen de confirmer que deux structures de répertoires (contenant de très gros fichiers) sont identiques: diff --recursive --brief(ou diff -r -qpour faire court, ou peut-être même diff -rq) fonctionneront et ne manqueront pas de mémoire.


sympa, je pense que -q est la clé ici, ne pas l'avoir peut nécessiter une différence pour mettre tout le fichier (ou au moins des lignes entières) en mémoire ...
rogerdpack

7

J'ai trouvé ce lien

diff -H peut vous aider, ou vous pouvez essayer d'installer le port textproc / 2bsd-diff qui, apparemment, n'essaye pas de charger les fichiers dans la RAM, il peut donc fonctionner plus facilement sur des fichiers volumineux.

Je ne sais pas si vous avez essayé ces deux options ou si elles pourraient fonctionner pour vous. Bonne chance.


1
Est-ce que cela aide quelqu'un? Pour moi, même échec ...
rogerdpack

12
Pour tous ceux qui se demandent: diff -Hest un alias non documenté et obsolète pour diff --speed-large-files.
a3nm

1
Cette réponse n'aide pas. Il s'agit d'une question Linux, et pour installer 2bsd-diff, vous devez d'abord le porter. Après avoir trouvé une source . Et corrigé . Possible, mais peu probable une solution viable.
nyov

1

Si les fichiers sont identiques (même longueur) à l'exception de quelques valeurs d'octets, vous pouvez utiliser un script comme celui-ci ( wc'est le nombre d'octets par ligne à hexdump, ajustez à votre largeur d'affichage):

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

Ce n'est pas très rapide, mais fait le travail.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.