понедельник, 28 декабря 2009 г.

Вычисление размера каталога - это больше, чем суммирование размеров файлов

Это перевод Computing the size of a directory is more than just adding file sizes. Автор: Реймонд Чен.

Кто-то может подумать, что вычисление размера каталога есть простое суммирование размера всех файлов, хранящихся в нём.

Ах, если бы это было так просто.

Есть множество вещей, которые делают вычисление размера каталога сложным, некоторые из которых даже дают повод сомневаться, существует ли вообще концепция "размер каталога".

Точки соединения (reparse points)
Мы упоминали их в последний раз. Хотите ли вы включать точки соединения в поиск, когда вы вычисляете размер каталога? Ну, это зависит от цели, по которой вы вычисляете размер каталога.

Если вы вычисляете размер, чтобы показать пользователю, сколько места он выиграет от удаления каталога - то вы включаете их или нет, смотря по тому как вы собираетесь удалять точку соединения: как ссылку или с содержимым.

Если вы вычисляете размер для копирования, то вы наверное захотите включить точки соединения в поиск. Или может быть нет - не должно ли копирование создавать/копировать сами точки соединения вместо копирования их содержимого? Что если пользователь не имеет прав на создание точек соединения? А если назначение не поддерживает точки соединения? Или пользователь делает копирование, потому что он хочет сделать бэкап?

Жёсткие ссылки (hard links)
Жёсткие ссылки являются несколькими записями в каталоге для одного и того же файла. Если вы вычисляете размер каталога и вы находите жёсткую ссылку, то посчитаете ли вы полный вес файла? Или вы скажете, что каждая запись жёсткой ссылки в каталоге несёт на себе часть "веса" файла? (так, если у файла есть две жёсткие ссылки, то каждая ссылка считается за половину размера файла).

Разделение веса файла по жёстким ссылкам поможет избежать повторного учёта, так что когда все ссылки найдены, то суммарный размер файла правильно вычисляется. Это представляет концепцию, что все жёсткие ссылки на файл "разделяют стоимость" ресурса, занимаемого файлом. Но что если вы не нашли все жёсткие ссылки файла? Правильно ли будет, если файл будет посчитан лишь частично?

Если вы копируете файл и вы обнаруживаете, что у него несколько жёстких ссылок, то что вы делаете? Вы разорвёте ссылки и сделаете несколько копий файла? Или вы попробуете воссоздать их? А что если назначение не поддерживает жёсткие ссылки?

Сжатые файлы (compressed files)
(Под этим я подразумеваю компрессию средствами файловой системы, а не внешние утилиты типа ZIP).
Когда суммируются размеры файлов в каталоге, вы добавляете логических или физический размер? Если вы суммируете размеры для копирования, то вы скорее всего хотите логический размер, но если вы хотите показать, как много можно освободить места, то вы захотите физический размер.

Но если вы делаете подсчёт для копирования и назначение поддерживает сжатие, то не захотите ли вы всё же физический размер? А вот теперь вы стали предполагать, что алгоритмы сжатия на источнике и назначении сравнимы друг с другом.

Разрежённые файлы (sparse files)
Разрежённые файлы имеют те же проблемы, что и сжатые. Вы суммируете логические или физические размеры?

Кластерное округление (cluster rounding)
Даже для не сжатых обычных файлов вы можете захотеть брать размер в дисковых блоках (кластерах). Каталог с тучей мелких файлов требует гораздо больше физического места на диске, чем просто сумма размеров файлов. Вы хотите отразить это в своих вычислениях? А если вы перешли через точку соединения, то размер кластера мог поменяться.

Дополнительные потоки данных (alternate data streams)
Альтернативные потоки данных являются ещё одним местом, где файл может занимать дисковое пространство, не отражённое в его "суммируемом размере".

Накладные расходы на учёт (bookkeeping overhead)
Всегда существуют накладные расходы связанные с файловым хранилищем. В дополнение к записи в каталоге (или записям), нужно также выделить место для информации о безопасности, а также о размещении файла по физическому пространству на диске. Для высоко-фрагментированных файлов эта информация может занимать довольно много места. Вы хотите учитывать это? Если да, то как?


Нет единого верного ответа на вопросы выше. Вы должны каждый раз индивидуально рассматривать каждый из них, применять его к своей ситуации и решать, каким путём вы пойдёте.

(а копирование дерева каталогов ещё более страшно. Что вы будете делать с ACL? Будете копировать и их тоже? Будете ли вы сохранять дату создания файлов? Это всё зависит от того, почему вы делаете копирование).

1 комментарий:

  1. Анонимный9 июля 2015 г., 15:24

    Круто. Виртуальная техническая философия.

    ОтветитьУдалить

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.