Разреженный файл

В информатике разреженный файл — это тип компьютерного файла , который пытается более эффективно использовать пространство файловой системы , когда сам файл частично пуст. Это достигается путем записи краткой информации ( метаданных ) , представляющей пустые блоки, на носитель данных вместо фактического «пустого» пространства, составляющего блок, что позволяет потреблять меньше места для хранения. Полный блок записывается на носитель в реальном размере только в том случае, если блок содержит «реальные» (непустые) данные.
Чаще всего разреженные файлы создаются, когда блоки файла никогда не записываются. Это типично для файлов с произвольным доступом, таких как базы данных. Некоторые операционные системы и утилиты идут еще дальше, «разрежая» файлы при их записи или копировании: если блок содержит только нулевые байты, он не записывается в хранилище, а помечается как пустой.
При чтении разреженных файлов файловая система прозрачно преобразует метаданные, представляющие пустые блоки, в «настоящие» блоки, заполненные нулевыми байтами во время выполнения. Приложение не знает об этом преобразовании.
Большинство современных файловых систем поддерживают разреженные файлы, включая большинство вариантов Unix и NTFS . [1] от Apple HFS+ не обеспечивает поддержку разреженных файлов, но в OS X уровень виртуальной файловой системы поддерживает их хранение в любой поддерживаемой файловой системе, включая HFS+. [ нужна ссылка ] Apple File System (APFS) также их поддерживает. [2] Разреженные файлы обычно используются для образов дисков , снимков баз данных , файлов журналов и в научных приложениях.
Преимущества
[ редактировать ]Преимущество разреженных файлов заключается в том, что пространство для хранения выделяется только тогда, когда это действительно необходимо: емкость хранилища сохраняется, и иногда можно создавать большие файлы, даже если на носителе недостаточно свободного места для исходного файла. Это также сокращает время первой записи, поскольку системе не нужно выделять блоки для «пропущенного» пространства. Если первоначальное распределение требует записи всех нулей в пространство, это также избавляет систему от необходимости дважды записывать «пропущенное» пространство.
Например, для образа виртуальной машины с максимальным размером 100 ГБ, в который фактически записано 2 ГБ файлов, потребуются полные 100 ГБ при резервном копировании в предварительно выделенном хранилище, но только 2 ГБ для разреженного файла. Если файловая система поддерживает перфорацию, а гостевая операционная система выдает команды TRIM , удаление файлов на гостевой системе соответственно уменьшит необходимое пространство.
Недостатки
[ редактировать ]Недостатком является то, что разреженные файлы могут стать фрагментированными ; отчеты о свободном пространстве файловой системы могут вводить в заблуждение; заполнение файловых систем, содержащих разреженные файлы, может иметь неожиданные последствия (например, ошибки переполнения диска или превышения квоты при простой перезаписи существующей части файла, который оказался разреженным); а копирование разреженного файла с помощью программы , которая их явно не поддерживает, может скопировать весь несжатый размер файла, включая нулевые разделы, которые не выделены на носителе, теряя преимущества разреженного свойства в файле. Разреженные файлы также не полностью поддерживаются всеми программами и приложениями для резервного копирования. Однако реализация VFS обходит стороной [ нужна ссылка ] предыдущие два недостатка. Загрузка исполняемых файлов в 32-битной Windows (exe или dll), которые являются разреженными, занимает гораздо больше времени, поскольку файл не может быть отображен в памяти в ограниченном адресном пространстве размером 4 ГБ и не кэшируется, поскольку не существует кодового пути для кэширования 32-битных разреженных исполняемых файлов ( Windows на 64-битных архитектурах может отображать разреженные исполняемые файлы). [ нужна ссылка ] В NTFS разреженные файлы (вернее, их ненулевые области) сжать невозможно. NTFS реализует разреженность как особый вид сжатия, поэтому файл может быть либо разреженным, либо сжатым.
Разреженные файлы в Unix
[ редактировать ]Разреженные файлы обычно обрабатываются прозрачно для пользователя. Но в некоторых ситуациях различия между обычным файлом и разреженным файлом становятся очевидными.
Создание
[ редактировать ]Команда Unix
dd of=sparse-file bs=5M seek=1 count=0
создаст файл размером пять мегабайт , но без данных, хранящихся на носителе (только метаданные ). ( ГНУ dd
имеет такое поведение, потому что он вызывает ftruncate
установить размер файла; другие реализации могут просто создать пустой файл.)
Аналогичным образом можно использовать команду truncate, если она доступна:
truncate -s 5M <filename>
В Linux существующий файл можно преобразовать в разреженный следующим образом:
fallocate -d <filename>
Не существует переносимого системного вызова для пробивания дыр; Linux предоставляет fallocate(FALLOC_FL_PUNCH_HOLE)
и Солярис предоставляет fcntl(F_FREESP)
.
Обнаружение
[ редактировать ]The -s
вариант ls
Команда показывает занятое пространство в блоках.
ls -ls sparse-file
Альтернативно, du
команда печатает занятое пространство, а ls
печатает видимый размер.
В некоторых нестандартных версиях du
, опция {{{1}}} печатает занятое пространство в байтах, а не в блоках, чтобы его можно было сравнить с ls
выход:
du --block-size=1 sparse-file
ls -l sparse-file
Обратите внимание, что приведенное выше использование du имеет сокращенный формат синтаксиса опций «du -B 1 sf», который сам по себе эквивалентен самой короткой версии «du -b sf», как указано в руководстве du: [3] -b, --bytes
эквивалентно --apparent-size --block-size=1
.
Кроме того, инструмент filefrag
от e2fsprogs
Пакет можно использовать для отображения деталей распределения блоков файла.
filefrag -v sparse-file
Копирование
[ редактировать ]Обычно версия GNU cp
хорошо определяет, является ли файл разреженным, поэтому
cp sparse-file new-file
создает новый файл, который будет разреженным. Однако у GNU cp есть --sparse
вариант. [4] Это особенно полезно, если файл, содержащий длинные нулевые блоки, сохранен неразреженным способом (т. е. нулевые блоки были записаны на носитель полностью). Сэкономить место для хранения можно, выполнив следующие действия:
cp --sparse=always file1 file1_sparsed
Некоторые реализации cp, например cp во FreeBSD , не поддерживают --sparse
вариант и всегда будет расширять разреженные файлы. Частично жизнеспособной альтернативой в этих системах является использование rsync со своим собственным --sparse
вариант [5] вместо КП. К сожалению --sparse
нельзя совмещать с --inplace
. [6] [7] Более новые версии rsync поддерживают --sparse
в сочетании с --inplace
. [8]
С помощью стандартного ввода разреженное копирование файлов достигается следующим образом:
cp --sparse=always /dev/fd/0 new-sparse-file < somefile
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Джампаоло, Доминик (1999). Практическое проектирование файловой системы с помощью файловой системы Be (PDF) . Издательство Морган Кауфманн . ISBN 9781558604971 .
- ^ «Руководство по файловой системе Apple» . Сайт разработчиков Apple . Apple Inc. Проверено 27 апреля 2017 г.
- ^ «Du(1) — страница руководства Linux» .
- ^ Мейеринг, Джим (21 декабря 1995 г.). «GNU coreutils/cp: принять новую опцию --sparse={never,auto,always}, чтобы контролировать создание разреженных файлов» . Проверено 17 июня 2016 г.
- ^ Триджелл, Эндрю (29 июня 1996 г.). «rsync: жесткие ссылки, улучшенная обработка разреженных данных, FERROR и FINFO» . Проверено 17 июня 2016 г.
- ^ Триджелл, Эндрю (30 июня 2016 г.). «Справочная страница rsync» . Проверено 19 января 2017 г.
- ^ Дэвисон, Уэйн (30 августа 2005 г.). «rsync: отклонять попытки объединить --sparse с --inplace» . Проверено 19 января 2017 г.
- ^ Дэвисон, Уэйн. «Поддержка --sparse в сочетании с --preallocate или --inplace» .
Внешние ссылки
[ редактировать ]- Разреженные файлы NTFS для программистов
- Создание разреженных файлов в Windows Server с помощью fsutil
- Создание разреженных файлов в Solaris с помощью mkfile(1M)
- Просмотр размера разреженного файла снимка базы данных
- SEEK_HOLE или FIEMAP: обнаружение дыр в разреженных файлах.
- virtsync — коммерческое решение для rsync.
--sparse
и--inplace
проблема. - SparseChecker — утилита, позволяющая управлять разреженными файлами в файловой системе NTFS.
- Phantom — программа для преобразования файлов в разреженные файлы для уменьшения потребления хранилища.
- ArchLinux Wiki: разреженный файл