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

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

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

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

Любые подсказки?

Ответы [ 2 ]

3 голосов
/ 19 октября 2011

Это зависит от операционной системы и иногда от файловой системы.В Linux с версии 2.6.28 реализовано FIEMAP ioctl(), а в ZFS на Solaris реализовано SEEK_HOLE и SEEK_DATA в lseek().

2 голосов
/ 19 октября 2011

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

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

...