Существует ли метод быстрого определения того, является ли чтение куски из (разреженного) файла - все нули?
-
26-10-2019 - |
Вопрос
Существует ли метод быстрого определения того, является ли (4KB-16MB) чтение из файла из файла-все нули?
Вы можете повторить кусок, проверяя каждый байт. Есть очевидные оптимизации, но она остается O (n).
Мой вариант использования предназначен для разреженных файлов. Я был бы совершенно счастлив за частичное решение, так что, если только кусок, который я только что прочитал, не поддерживается каким -либо хранением дисков (то есть это отверстие), то вернул True.
Какие -нибудь подсказки?
Решение
Это зависит от операционной системы, а иногда и файловой системы. Linux с 2.6.28 реализовал FIEMAP
ioctl()
, и ZFS на Solaris реализуют SEEK_HOLE
а также SEEK_DATA
в lseek()
.
Другие советы
Моя первая мысль была: «Как это делает rsync?»
Оказывается, RSYNC просто проверяет данные на блок нулей и пишет их как редкие файлы. Видеть fileio.c
В исходном коде RSYNC, если вам нужны подробности кровавого.