28

Я получаю сообщение diff: memory exhausted при попытке выполнить различие двух файлов размером 27 ГБ, которые в значительной степени похожи на Linux-коробку с CentOS 5 и 4 ГБ оперативной памяти. Кажется, это известная проблема.

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

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

Любые идеи, кроме разделения файла на более мелкие части? У меня есть 40 таких файлов, поэтому я стараюсь не разбивать их.

3 ответа3

12

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

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

6

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

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .