Действительно ли файлы git pack необходимы на диске? - PullRequest
3 голосов
/ 15 января 2020

Насколько я понимаю, git хэши SHA1 имели побочный эффект сокращения дискового хранилища, не дублируя идентичные объекты, и было введено сжатие zlib для явного сокращения дискового хранилища репозиториев. Позже были добавлены пакеты, в которых были добавлены дельты для дальнейшего уменьшения размера, а также сгруппированы несколько объектов в один файл для улучшения передачи по сети.

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

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

Я просто не вижу выгоды от фактической группировки объектов в файл пакета. Это должно уменьшить количество разговоров при согласовании того, какие объекты необходимо передать? В этом случае создается впечатление, что файл .idx может «определить» виртуальный пакет, но оставить фактические объекты отдельными файлами на диске и только «упаковать» их при передаче.

Я в основном желая лучшего понимания файлов пакета и причин для них. Я работал с коллегой, у которого есть проблемное хранилище c, и понимание файлов пакета помогает мне помочь ему.

РАЗЪЯСНЕНИЕ: Мой главный вопрос не «почему файлы пакета полезны», это : Каково преимущество хранения отдельных объектов вместе в файле пакета вместо того, чтобы индекс указывал только на отдельные файлы? Какая выгода есть? Я вижу только тот недостаток, что приходится перезаписывать файлы пакета при удалении объектов. Я полностью использую преимущества deltas.

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:

Больше понимания того, как работают файлы пакета и почему:

  1. Файлы пакета в основном оптимизированы для сетевой передачи. , уменьшая общий размер передаваемых данных. Похоже, что это является движущей силой проектных решений.
  2. Чтобы восстановить объект, каждый файл пакета должен быть найден до тех пор, пока не будет найден идентификатор объекта / га sh.
  3. Структура файлов индекса позволяет осуществлять быстрый двоичный поиск, а структуры файлов индекса и пакета позволяют быстро находить базовые данные и дельты
  4. Файлы пакета являются автономными, что означает спецификацию c Пакетный файл должен содержать базовый файл и любые дельты, необходимые для создания единого объекта

Итак, я вижу следующее:

  1. Меньше индексных файлов, которые должны быть поиск, тем быстрее будет найден объект
  2. Наличие базы и всех дельт для связанных объектов в одном файле ОС повышает производительность воссоздания объекта, открывая только один файл (для фактических данных)
  3. Каждый бит и байт для передачи по сети имеют значение

Благодаря всему этому я осознаю, что моей основной проблемой является размер диск из пакета файлов. Чрезвычайно большие файлы на диске труднее обрабатывать в целом - как с точки зрения резервного копирования / восстановления, так и с точки зрения изменения содержимого.

Приведенные выше три момента, которые я наблюдал, не требуют того, что я имею в виду понимание, получение максимально возможного количества объектов в реальном файле .pack. Я вижу преимущество как можно большего количества записей в файле .idx для ускорения поиска объекта, но у меня есть предчувствие, что файлы .pack можно хранить в виде нескольких файлов меньшего размера и при этом достичь целей производительности сети и на диске. Даже такая простая схема, как отдельный файл пакета на базу, и это дельта-дерево. Существующая схема индекса все еще может сгруппировать их и сохранить существующую структуру пакета для передачи.

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

Ответы [ 3 ]

1 голос
/ 15 января 2020

Без файлов пакета Git вообще не хранит дельты. Если у вас есть файл размером 100 КБ в одном коммите, то создайте новый коммит, который изменит один байт в этом файле, и этот коммит также сохранит файл 100 КБ полностью. git show просто «рендерит» коммит как diff из родительского.

Pack files буквально заменяет копию файла на фактический diff, что означает, что извлечение потребует реконструкции файла вместо простого копирования его из хранилища в рабочий каталог.

1 голос
/ 15 января 2020

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

0 голосов
/ 15 января 2020

Файлы постоянно загружаются. Он был сведен к минимуму настолько, насколько это практически осуществимо, поэтому, насколько бы оно ни было незначительным, это необходимо, так что об этом никто особо не беспокоится Обычно это как минимум сотни байтов. Открытие файла также имеет свою стоимость - метаданные должны быть прочитаны, разрешения должны быть проверены, текущие позиции чтения должны быть сохранены. Любой из них, в масштабе отдельных объектов и того, что дает вам дельта-сжатие, является очень тяжелым штрафом, намного превышающим любые преимущества сжатия для небольших объектов, и я не пытаюсь быть здесь исчерпывающим или рисовать полную картину.

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