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

StackOverflow https://stackoverflow.com/questions/7818439

  •  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, если вам нужны подробности кровавого.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top