Ускорение сравнения файлов (с `cmp`) на Cygwin?

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

к сожалению, это, кажется, работает ужасно медленно - принимая около десяти (Edit: на самом деле 25!) время, необходимое для создания одного из наборов файлов с помощью программы Python.

Я правильно понимаю, что это очень медленно? Есть ли какие-то простые альтернативы, которые пошли бы быстрее?

(разработать немного на мой вариант использования: я автогенераторный кучу .c файлы во временном каталоге, и когда я их повторно генерирую, я хотел бы скопировать только те, которые изменились в фактический исходный каталог, оставив неизмененные нетронутыми (с их старыми временами создания), так что make будет знать, что их не нужно перекомпилировать. Не все сгенерированные файлы .c файлы, хотя, поэтому мне нужно делать двоичные сравнения, а не текстовые сравнения.)

2 ответов


может быть, вы должны использовать Python, чтобы сделать некоторые или даже все работы сравнение тоже?

одним из улучшений было бы только беспокоить запуск cmp Если размеры файлов одинаковые, если они разные, очевидно, что файл был изменен. Вместо cmp, вы можете подумать о создании хэша для каждого файла, используя MD5 или SHA1 или SHA-256 или что угодно (используя модули или расширения Python, если это правильный термин). Если ты думаешь, что не справишься, со злым умыслом, то MD5, вероятно, достаточно, чтобы определить различия.

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

Да, похоже, что это занимает слишком много времени. Но беда включает в себя запуская 1000 экземпляров из cmp, плюс другая обработка. Как Python и предложений скрипт выше объединяет то, что они не запускать программы 1000 раз; они пытаются свести к минимуму количество выполняемых программ. Это сокращение количества выполняемых процессов даст вам довольно большой взрыв для вас, я ожидаю.


Если вы можете сохранить хэши из "текущего набора файлов" вокруг и просто создать новые хэши для нового набора файлов, а затем сравнить их, вы будет делать хорошо. Очевидно, что если файл, содержащий "старые хэши" (текущий набор файлов), отсутствует, вам придется регенерировать его из существующих файлов. Это немного конкретизирует информацию в комментариях.

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


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

короткий ответ: добавить --silent на cmp позвоните, если он еще не там.

вы можете ускорить версию Python, выполнив некоторые проверки размера файла перед проверкой данных.

во-первых, быстро-и-hacky bash(1) техника, которая может быть далеко проще, если вы можете изменить на один