Як відрізняти великі файли в Linux


31

Я отримую diff: memory exhaustedпомилку при спробі розрізнити два 27 ГБ файли, які значною мірою схожі на коробці Linux із CentOS 5 та 4 ГБ оперативної пам’яті. Це, мабуть, відома проблема.

Я б очікував, що існує така альтернатива для такої необхідної утиліти, але я не можу її знайти. Я думаю, що рішенням доведеться використовувати тимчасові файли, а не пам’ять, щоб зберігати потрібну йому інформацію.

  • Я намагався використовувати rdiffі xdelta, але вони краще для показу змін між двома файлами, як патч, а не те, що корисно для перевірки відмінностей між двома файлами.
  • Спробував VBinDiff , але це наочний інструмент, який краще для порівняння бінарних файлів. Мені потрібно щось, що може передати різниці STDOUT як звичайне diff.
  • Є багато інших утиліт, таких як, vimdiffякі працюють лише з меншими файлами.
  • Я також читав про Solaris, bdiffале не зміг знайти порт для Linux.

Будь-які ідеї, крім розбиття файлу на менші шматки? У мене є 40 таких файлів, тому намагаюся уникнути роботи над їх розбиттям.


яку версію xdelta ви спробували? xdelta3 чи xdelta1?
nmuntz

Це була версія 1.1.4. Чи надає xdelta3 різні функції? Я щойно перевірив онлайн-документ і, як видається, йдеться про надання "дельти".
Том Б


Дивіться також цю відповідь: unix.stackexchange.com/a/77259/27186
unhammer

Відповіді:


12

cmpробить байт за байтом, тому, ймовірно, не вистачить пам’яті (якраз тестував його на двох 7 ГБ файлах) - але ви можете шукати більш детальну інформацію, ніж список «файлів X і Y відрізняються в байті x , рядок y ". Якщо схожість ваших файлів зміщена (наприклад, файл Y має однаковий блок тексту, але не в тому самому місці), ви можете передати зміщення до cmp; ви, ймовірно, можете перетворити це на ресинхронізацію порівняння з невеликим сценарієм.

Убік: Якщо хтось інший приземлиться тут, шукаючи спосіб підтвердити, що дві структури каталогів (містять дуже великі файли) однакові: diff --recursive --brief(або diff -r -qкоротко, або, можливо, навіть diff -rq) працюватимуть і не втрачається пам'ять.


приємно, я думаю, що тут - ключовий ключ, інакше його немає, може знадобитися різниця, щоб увесь файл (або принаймні цілі рядки)
помістити

7

Я знайшов це посилання

diff -H може допомогти, або ви можете спробувати встановити порт textproc / 2bsd-diff, який, мабуть, не намагається завантажити файли в оперативну пам’ять, тому він може працювати з великими файлами простіше.

Я не впевнений, чи ви спробували ці два варіанти, чи вони можуть допомогти вам. Удачі.


1
Чи допомагає це комусь там? Для мене
така

12
Для всіх, хто цікавиться: diff -Hце незадокументований і застарілий псевдонім для diff --speed-large-files.
a3nm

1
Ця відповідь не допомагає. Це питання Linux, і для того, щоб встановити 2bsd-diff, ви повинні спочатку перенести його. Після того, як ви знайшли джерело . І закріпив її . Можливе, але малоймовірне життєздатне рішення.
nyov

1

Якщо файли однакові (однакової довжини), за винятком кількох значень байтів, ви можете використовувати такий сценарій, як наступний ( wчисельність байтів у рядку до шістнадцяткової дампи, регулюйте відповідно до ширини відображення):

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

Це не дуже швидко, але робить роботу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.