Многопоточный двоичный инструмент сравнения?
Есть много бинарных инструментов сравнения:
и так далее. Они замечательные, но однопоточные. Можно ли разделить большие файлы на чанки, найти 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 ...
но для этого нужен очень большой объем памяти! (не подходит для больших файлов)