Как сделать файл разреженным? - PullRequest
8 голосов
/ 13 мая 2011

Если у меня большой файл, содержащий много нулей, как я могу эффективно сделать его разреженным?

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

Или есть возможность сделать это в существующем файле (например, File.setSparse (длинный старт, длинный конец))?

Я ищу решение в Java или в некоторых командах Linux, файловая система будет ext3 или аналогичной.

Ответы [ 5 ]

3 голосов
/ 13 мая 2011

Некоторые файловые системы в Linux / UNIX имеют возможность «пробивать дыры» в существующем файле.См .:

Это не очень портативно и не сделано одинаково по всем направлениям;на данный момент, я полагаю, что библиотеки ввода-вывода Java не предоставляют интерфейс для этого.

Если дырокол доступен либо через fcntl(F_FREESP), либо через любой другой механизм, он должен быть значительно быстрее, чем копирование / поискцикл.

2 голосов
/ 29 января 2019

За 8 лет многое изменилось.

Fallocate

fallocate -dfilename можно использовать для пробивания отверстий в существующих файлах.Из справочной страницы fallocate(1) :

       -d, --dig-holes
              Detect and dig holes.  This makes the file sparse in-place,
              without using extra disk space.  The minimum size of the hole
              depends on filesystem I/O block size (usually 4096 bytes).
              Also, when using this option, --keep-size is implied.  If no
              range is specified by --offset and --length, then the entire
              file is analyzed for holes.

              You can think of this option as doing a "cp --sparse" and then
              renaming the destination file to the original, without the
              need for extra disk space.

              See --punch-hole for a list of supported filesystems.

(Этот список:)

              Supported for XFS (since Linux 2.6.38), ext4 (since Linux
              3.0), Btrfs (since Linux 3.7) and tmpfs (since Linux 3.5).

GNU cp

Кроме того, где-топо пути GNU cp получил понимание разреженных файлов.Цитируя cp(1) справочную страницу относительно режима по умолчанию, --sparse=auto:

разреженные файлы SOURCE обнаруживаются грубой эвристикой, и соответствующий файл DEST также делается разреженным.

Но есть также --sparse=always, который активирует копию файла, эквивалентную тому, что fallocate -d делает на месте:

Укажите --sparse=always, чтобы создатьразреженный файл DEST, когда файл SOURCE содержит достаточно длинную последовательность нулевых байтов.

Я наконец-то смог удалить свою однострочную строку tar cpSf - SOURCE | (cd DESTDIR && tar xpSf -), которая в течение 20 лет была моим седобородым способомкопирование разреженных файлов с сохранением их разреженности.

2 голосов
/ 13 мая 2011

Я думаю, вам лучше предварительно выделить весь файл и сохранить таблицу / BitSet занятых страниц / разделов.

Создание разреженного файла приведет к фрагментации этих разделов, если они когда-либо будут использоваться повторно. Возможно, сохранение нескольких ТБ дискового пространства не стоит потери производительности сильно фрагментированного файла.

0 голосов
/ 25 января 2012

Вы можете использовать $ truncate -s filename filesize на linux teminal для создания разреженного файла, имеющего

только метаданные.

ПРИМЕЧАНИЕ. - Размер файла указан в байтах.

0 голосов
/ 13 мая 2011

Согласно этой статье , кажется, что в настоящее время нет простого решения, кроме использования FIEMAP ioctl.Тем не менее, я не знаю, как вы можете превратить «не разреженные» нулевые блоки в «разреженные».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...