Существует ли способ быстрого определения, являются ли все фрагменты, считываемые из (разреженного) файла, нулями?

Существует ли способ быстрого определения того, является ли чанк (4 КБ-16 МБ), считанный из файла, всеми нулями?

Вы можете перебирать чанк, проверяя каждый байт. Есть очевидные оптимизации, но они остаются O(N).

Мой вариант использования для разреженных файлов. Я был бы совершенно счастлив за частичное решение, такое, что если только что прочитанный кусок не поддерживается никаким дисковым хранилищем (т. Е. Это дыра), тогда верните true.

Есть намеки?

2 ответа

Решение

Это зависит от операционной системы и иногда от файловой системы. Linux начиная с 2.6.28 реализовал FIEMAPioctl() и ZFS на Solaris реализует SEEK_HOLE а также SEEK_DATA в lseek(),

Моей первой мыслью было: "Как rsync это делает?"

Оказывается, что rsync просто проверяет данные на наличие нулевых блоков и записывает их в виде разреженных файлов. Увидеть fileio.c в исходном коде rsync, если вам нужны подробности.

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