Как различать большие файлы в 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, различающихся в байтах х , линия у ". Если сходство ваших файлов смещено (например, файл Y имеет идентичный блок текста, но не в том же месте), вы можете передать смещения cmp; Вы могли бы, вероятно, превратить его в ресинхронизирующее сравнение с помощью небольшого скрипта.

В сторону: В случае, если кто-то еще приземлится здесь, когда ищет способ подтвердить, что две структуры каталогов (содержащие очень большие файлы) идентичны: diff --recursive --brief(или diff -r -qдля краткости, или, возможно, даже diff -rq) будут работать и не исчерпывать память.

Феликс
источник
хорошо, я думаю, ключ -q здесь, почему-то без него может потребоваться diff, чтобы поместить весь файл (или, по крайней мере, целые строки) в память ...
rogerdpack
7

Я нашел эту ссылку

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

Я не уверен, что вы пробовали эти два варианта или они могли бы работать на вас. Удачи.

Jarvin
источник
1
Это помогает кому-нибудь там? Для меня такой же провал ...
rogerdpack
12
Для всех, кто задается вопросом: diff -Hэто недокументированный и устаревший псевдоним для diff --speed-large-files.
a3nm
1
Этот ответ не помогает. Это вопрос linux, и для установки 2bsd-diff вам придется сначала его портировать. После того, как вы нашли источник . И исправил это . Возможное, но вряд ли жизнеспособное решение.
nyov
1

Если файлы идентичны (одинаковой длины), за исключением нескольких значений байтов, вы можете использовать скрипт, подобный следующему ( wколичество байтов на строку в hexdump, отрегулируйте по ширине экрана):

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

Это не очень быстро, но делает работу.

Tino
источник