Come diff file di grandi dimensioni su Linux


31

Ricevo un diff: memory exhaustederrore quando provo a diffondere due file da 27 GB che sono in gran parte simili su un box Linux con CentOS 5 e 4 GB di RAM. Questo è un problema noto, a quanto pare.

Mi aspetterei che ci sia un'alternativa per un'utilità così essenziale, ma non riesco a trovarne una. Immagino che la soluzione dovrebbe usare file temporanei anziché memoria per archiviare le informazioni di cui ha bisogno.

  • Ho provato a usare rdiffe xdelta, ma sono migliori per mostrare le modifiche tra due file, come una patch, e non sono utili per controllare le differenze tra due file.
  • Ho provato VBinDiff , ma è uno strumento visivo che è migliore per confrontare i file binari. Ho bisogno di qualcosa che possa convogliare le differenze a STDOUT come al solito diff.
  • Ci sono molte altre utility come quelle vimdiffche funzionano solo con file più piccoli.
  • Ho anche letto di Solaris bdiffma non sono riuscito a trovare una porta per Linux.

Qualche idea oltre a dividere il file in pezzi più piccoli? Ho 40 di questi file, quindi cerco di evitare il lavoro di scomporli.


quale versione di xdelta hai provato? xdelta3 o xdelta1?
nmuntz,

Era la versione 1.1.4. Xdelta3 offre funzionalità diverse? Ho appena controllato il documento online e sembra ancora riguardare la fornitura di "delta".
Tom B,


Vedi anche questa risposta: unix.stackexchange.com/a/77259/27186
unhammer

Risposte:


12

cmpfa le cose byte per byte, quindi probabilmente non esaurirà la memoria (appena testato su due file da 7 GB) - ma potresti cercare più dettagli di un elenco di "file X e Y differiscono su byte x , linea y ". Se le somiglianze dei tuoi file sono sfalsate (ad esempio, il file Y ha un blocco di testo identico, ma non nella stessa posizione), puoi passare gli offset a cmp; probabilmente potresti trasformarlo in un confronto risincronizzante con un piccolo script.

A parte: nel caso in cui qualcun altro atterra qui quando cerca un modo per confermare che due strutture di directory (contenenti file molto grandi) sono identiche: diff --recursive --brief(o diff -r -qin breve, o forse anche diff -rq) funzionerà e non esaurirà la memoria.


bello, penso -q è la chiave qui, in qualche modo non averlo può richiedere diff per mettere l'intero file (o almeno intere righe) in memoria ...
rogerdpack

7

Ho trovato questo link

diff -H potrebbe aiutare, oppure puoi provare a installare la porta textproc / 2bsd-diff che a quanto pare non tenta di caricare i file nella RAM, quindi può lavorare su file di grandi dimensioni più facilmente.

Non sono sicuro se hai provato quelle due opzioni o se potrebbero funzionare per te. In bocca al lupo.


1
Questo aiuta qualcuno? Per me, lo stesso fallimento ...
rogerdpack

12
Per chiunque si chieda: diff -Hè un alias non documentato e deprecato per diff --speed-large-files.
a3nm,

1
Questa risposta non aiuta. Questa è una domanda su Linux, e per installare 2bsd-diff dovresti prima portarla. Dopo aver trovato una fonte . E rattoppato . Possibile, ma improbabile, una soluzione praticabile.
nyov

1

Se i file sono identici (stessa lunghezza) ad eccezione di alcuni valori di byte, è possibile utilizzare uno script come il seguente ( wè il numero di byte per riga in hexdump, regolare la larghezza del display):

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

Non è molto veloce, ma fa il lavoro.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.