Сделайте сжатые файлы zstd "rsyncable", как это делает gzip с опцией --rsyncable
Есть ли способ сделать сжатые файлы zstd "rsyncable", как это делает gzip с --rsyncable
вариант?
Я попытался разбить входные файлы на куски фиксированной длины и сжать их по отдельности, но не повезло.
О --rsyncable
опция:
Когда вы синхронизируете сжатый файл между двумя компьютерами, этот параметр позволяет rsync передавать только файлы, которые были изменены в архиве, а не весь архив. Обычно после внесения изменений в любой файл в архиве алгоритм сжатия может генерировать новую версию архива, которая не соответствует предыдущей версии архива. В этом случае rsync передает всю новую версию архива на удаленный компьютер. С помощью этой опции rsync может передавать только измененные файлы, а также небольшое количество метаданных, необходимых для обновления структуры архива в измененной области.
1 ответ
Я попытался разбить входные файлы на куски фиксированной длины и сжать их по отдельности, но не повезло.
Это должно работать NP при условии, что вы меняете только байты, не перемещая их.
То есть, если вы разделите "The hog crawled under the high fence"
в куски фиксированного размера ["The hog ", "crawled ", "under th", "e high f", "ence"]
и затем независимо сжимать их, тогда изменение "hog" на "dog" будет rsync-friendly, потому что сжатая версия оставшихся кусков, ["crawled ", "under th", "e high f", "ence"]
будет все так же.
Если, с другой стороны, вы перемещаете байты, например, когда вы заменяете "свинью" на "гусеницу", то расщепление больше не поможет, потому что куски ["The cat", "erpillar", " crawled", " under t", "he high ", "fence"]
сейчас разные, а значит и разные их сжатая версия.
Rsync поможет с первым, но не с последним.
Если вы хотите произвольные модификации, вам понадобится умный алгоритм разбиения на фрагменты, который тяготеет к определенным точкам файла. Например, если вы разделите "The hog crawled under the high fence"
на пространстве, в "The ", "hog ", "crawled ", "under ", "the ", "high ", "fence"
то замена "hog" на "caterpillar" изменит только один сжатый кусок, что позволит rsync не передавать остальные из них.