Почему bsdiff.exe имеет проблемы с этим меньшим файлом?
Я создаю программный патч с использованием bsdiff.exe и применяю его с bspatch.exe, и до сих пор у меня не было проблем с файлами размером менее 120 МБ. Один бинарный файл, который у меня был ранее, был 21 МБ, а теперь 77 МБ, и bsdiff, похоже, висит на нем бесконечно.
Согласно документации, "bsdiff довольно требователен к памяти. Для него требуется максимум (17*n,9*n+m)+O(1) байт памяти, где n - размер старого файла, а m - размер". нового файла. " Это объясняет проблему с большими файлами, но проблема возникает, когда дельта больше.
У кого-нибудь есть информация по этому поводу? Все будет полезно, спасибо!
2 ответа
У меня также была проблема со сбоем bsdiff при попытке обработать файл, содержащий всего 2 МБ исполняемого кода DSP.
После некоторой отладки я определил, что проблема заключается в функции qsufsort, которая используется для создания массива суффиксов на основе "старого" файла. qsufsort вызывает функцию с именем split, которая вызывает себя рекурсивно. В случае сбоя рекурсивный вызов происходит так много раз, что программе не хватает места в стеке и выдается исключение.
В соответствии с этой веткой: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=409664 Решение состоит в том, чтобы заменить qsufsort другим решением для создания массива суффиксов. Запись в Википедии для массивов суффиксов ссылается на SA-IS, поэтому я скачал источник здесь: https://sites.google.com/site/yuta256/sais
Затем я пересобрал bsdiff.c вместе с sais.c и sais.h и заменил вызов qsufsort на:
I [0] = oldsize; sais (старый, I+1, старый);
Теперь bsdiff работает каждый раз и быстрее!
Попробуйте одну из других программ бинарного сравнения, перечисленных здесь:
Двоичный инструмент сравнения для очень больших файлов?
Различия между этими двумя файлами требуют памяти, превышающей объем памяти, необходимый для представления обоих файлов. Таким образом, обработка двух двоичных файлов с большим количеством различий потребует больше памяти, чем два идентичных файла.
У него проблемы с меньшим файлом, потому что в программном обеспечении есть ошибка. Колин Персиваль, парень, который написал это, признал ошибку и сказал, что у него нет времени, чтобы исправить это.