У меня есть продукт, который делает онлайн-бэкапы с помощью rdiff. В настоящее время происходит следующее:
Скопируйте файл в промежуточную область (чтобы файл не исчез или не изменился, пока мы работаем над ним)
Хэширует исходный файл и вычисляет сигнатуру rdiff (используется для дельта-дифференциации) Вычисляет дельта-разницу rdiff (если у нас нет предыдущей версии, этот шаг пропускается)
Сжимает и шифрует полученную дельта-разность
В настоящее время эти этапы выполняются отдельно друг от друга. Конечным результатом является то, что мы перебираем файл несколько раз. Для небольших файлов это не имеет большого значения (особенно с учетом кэширования диска), но для больших файлов (10 или даже 100 ГБ) это настоящий убийца производительности.
Я хочу объединить все эти шаги в один проход чтения/записи.
Для этого мы должны иметь возможность выполнять все вышеперечисленные шаги в потоковом режиме, сохраняя при этом все «выходные данные» — хэш файла, подпись rdiff, сжатый и зашифрованный файл дельта-разницы. Это повлечет за собой чтение блока данных из исходного файла (скажем, 100 КБ?), Затем перебор файла в памяти для обновления хэша, подписи rdiff, дельта-дифференциации, а затем запись вывода в выходной поток сжатия/шифрования. . Цель состоит в том, чтобы значительно свести к минимуму количество перегрузок диска, которые мы делаем.
В настоящее время мы используем rdiff.exe (который представляет собой тонкий слой поверх базовой библиотеки librsync) для вычисления подписей и создания двоичных дельт. Это означает, что они выполняются в отдельном процессе и выполняются за один раз, а не в потоковом режиме.
Как я могу заставить это делать то, что мне нужно, используя библиотеку librsync?