Многопоточный двоичный инструмент сравнения?

Есть много бинарных инструментов сравнения:

и так далее. Они замечательные, но однопоточные. Можно ли разделить большие файлы на чанки, найти diff между чанками одновременно, а затем слиться в конечную дельту? Любые другие инструменты, библиотеки, чтобы найти дельту между очень большими файлами (сотни Гб) за разумное количество времени и оперативной памяти? Может быть, я мог бы реализовать алгоритм сам, но не могу найти какие-либо документы по этому поводу.

1 ответ

ECMerge является многопоточным и может сравнивать огромные файлы.

библиотеки, чтобы найти дельту между очень большими файлами (сотни ГБ) за разумное количество времени и ОЗУ?

попробуйте HDiffPatch, он используется в игре на 50 ГБ (не на 100 ГБ): https://github.com/sisong/HDiffPatch
он может работать быстро для больших файлов, но не отличается многопоточностью;
Создание патча:hdiffz -s-1k -c-zlib old_path new_path out_delta_file
Применение патча: hpatchz old_path delta_file out_new_path
diff с -s-1k и введите файлы размером 100 ГБ, требуется ~ 100 ГБ *16/1k < 2 ГБ памяти; если diff с -s-128k, то меньше времени и меньше памяти;

bsdiff можно изменить на многопоточность:

  • алгоритм сортировки суффиксных массивов можно заменить на msufsort, это многопоточный алгоритм построения суффиксных массивов;
  • функция match изменена на многопоточную версию, новый файл обрезан по номеру потока;
  • Компрессор bzip2 изменен на многопоточную версию, такую ​​как pbzip2 или lzma2 ...

но для этого нужен очень большой объем памяти! (не подходит для больших файлов)

Другие вопросы по тегам