В информатике разреженный файл является типом компьютерного файла который пытается более эффективно использовать пространство файловой системы , когда сам файл частично пуст. Это достигается путем записи на диск краткой информации (метаданные ), представляющей пустые блоки, вместо фактического «пустого» пространства, составляющего блок, с использованием меньшего дискового пространства. Полный размер блока записывается на диск как фактический размер только тогда, когда блок содержит «реальные» (непустые) данные.
При чтении разреженных файлов файловая система прозрачно преобразует метаданные, представляющие пустые блоки, в «реальные» блоки, заполненные нулевыми байтами во время выполнения. Приложение не знает об этом преобразовании.
Большинство современных файловых систем поддерживают разреженные файлы, включая большинство вариантов Unix и NTFS. HFS + Apple не поддерживает разреженные файлы, но в OS X уровень виртуальной файловой системы поддерживает их хранение в любой поддерживаемой файловой системе, включая HFS +. Файловая система Apple (APFS), анонсированная в июне 2016 года на WWDC, также поддерживает их. Разреженные файлы обычно используются для образов дисков, снимков базы данных, файлов журнала и в научных приложениях.
Преимущество разреженных файлов заключается в том, что хранилище выделяется только тогда, когда оно действительно необходимо: дисковое пространство сохраняется, и большие файлы могут создаваться даже при наличии недостаточно свободного места в файловой системе. Это также сокращает время первой записи, поскольку системе не нужно выделять блоки для «пропущенного» пространства. Если первоначальное выделение требует записи всех нулей в пространство, это также избавляет систему от необходимости дважды перезаписывать «пропущенное» пространство.
Например, для образа виртуальной машины с максимальным размером 100 ГБ, на котором фактически записано 2 ГБ файлов, потребуются полные 100 ГБ при поддержке предварительно выделенного хранилища, но только 2 ГБ на разреженном файл. Если файловая система поддерживает перфорацию, а гостевая операционная система выдает команды TRIM, удаление файлов на гостевой машине соответственно уменьшит необходимое пространство.
Недостатки в том, что разреженные файлы могут стать фрагментированными ; отчеты о свободном пространстве файловой системы могут вводить в заблуждение; заполнение файловых систем, содержащих разреженные файлы, может иметь неожиданные последствия (например, ошибки переполнения диска или превышения квоты при простой перезаписи существующей части файла, которая оказалась разреженной); и копирование разреженного файла с помощью программы , которая явно не поддерживает их, может скопировать весь несжатый размер файла, включая нулевые разделы, которые не размещены на диске, - теряя преимущества свойства разреженности в файл. Разреженные файлы также полностью не поддерживаются всеми программами и приложениями резервного копирования. Однако реализация VFS обходит два предыдущих недостатка. Загрузка исполняемых файлов в 32-битной Windows (exe или dll), которые являются разреженными, занимает гораздо больше времени, так как файл не может быть отображен в памяти в ограниченном адресном пространстве 4 ГБ и не кэшируется, так как отсутствует кодовый путь для кеширования 32-битные разреженные исполняемые файлы (Windows на 64-битных архитектурах может отображать разреженные исполняемые файлы). В NTFS разреженный файл (а точнее его ненулевые области) не может быть сжат. NTFS реализует разреженность как особый вид сжатия, поэтому файл может быть разреженным или сжатым.
Разреженные файлы обычно обрабатываются прозрачно для пользователя. Но в некоторых ситуациях различия между обычным файлом и разреженным файлом становятся очевидными.
Команда Unix
dd of = sparse-file bs = 5M seek = 1 count = 0
создаст файл из пяти мебибайт, но без данных, хранящихся на диске (только метаданные ). (GNU dd
имеет такое поведение, потому что он вызывает ftruncate
для установки размера файла; другие реализации могут просто создать пустой файл.)
Аналогичным образом можно использовать команду truncate, если доступно:
truncate -s 5M
В Linux существующий файл можно преобразовать в разреженный с помощью:
fallocate -d
Увы, нет переносимого способа пробить дыры; системный вызов: fallocate (FALLOC_FL_PUNCH_HOLE) в Linux, fcntl (F_FREESP) в Solaris.
The -s
опция команды ls
показывает занимаемое пространство в блоках.
ls -ls sparse-file
В качестве альтернативы команда du
печатает занимаемое пространство, а ls
печатает видимый размер. В некоторых нестандартных версиях du
опция --block-size = 1
печатает занимаемое пространство в байтах вместо блоков, так что его можно сравнить с ls
output:
du --block-size = 1 sparse-file ls -l sparse-file
Обычно версия cp
GNU хорошо обнаруживает является ли файл разреженным, поэтому
cp sparse-file new-file
создает новый файл, который будет разреженным. Однако в GNU cp есть опция --sparse
. Это особенно полезно, если файл, содержащий длинные нулевые блоки, сохраняется не разреженным (т.е. нулевые блоки были записаны на диск полностью). Дисковое пространство можно сэкономить, выполнив:
cp --sparse = always file1 file1_sparsed
Некоторые реализации cp, такие как cp FreeBSD, не поддерживают - опция разреженного
и всегда будет расширять разреженные файлы. Частично жизнеспособной альтернативой в этих системах является использование rsync с собственной опцией --sparse
вместо cp. К сожалению, --sparse
нельзя комбинировать с --inplace
.
cp --sparse = always / proc / self / fd / 0 new-sparse-file < somefile
--sparse
и --inplace
в rsync.