Существует ли способ быстрого определения, являются ли все фрагменты, считываемые из (разреженного) файла, нулями?
Существует ли способ быстрого определения того, является ли чанк (4 КБ-16 МБ), считанный из файла, всеми нулями?
Вы можете перебирать чанк, проверяя каждый байт. Есть очевидные оптимизации, но они остаются O(N).
Мой вариант использования для разреженных файлов. Я был бы совершенно счастлив за частичное решение, такое, что если только что прочитанный кусок не поддерживается никаким дисковым хранилищем (т. Е. Это дыра), тогда верните true.
Есть намеки?
2 ответа
Это зависит от операционной системы и иногда от файловой системы. Linux начиная с 2.6.28 реализовал FIEMAP
ioctl()
и ZFS на Solaris реализует SEEK_HOLE
а также SEEK_DATA
в lseek()
,
Моей первой мыслью было: "Как rsync это делает?"
Оказывается, что rsync просто проверяет данные на наличие нулевых блоков и записывает их в виде разреженных файлов. Увидеть fileio.c
в исходном коде rsync, если вам нужны подробности.