Я написал более быстрый альтернативный ratarmount , который «работает для меня», потому что эта проблема продолжала беспокоить меня.
Вы можете использовать это так:
pip3 install --user ratarmount
ratarmount my-huge-tar.tar mount-folder
ls -la mount-folder # will show the contents of the tar top-level
Когда вы закончите, вы можете размонтировать его, как любое крепление FUSE:
fusermount -u mount-folder
Почему это быстрее, чем архивирование?
Это зависит от того, что вы измеряете.
Вот эталон объема памяти, необходимого времени для первого монтирования, а также времени доступа для простой cat <file-in-tar>
команды и простой find
команды.
Папки, содержащие каждый 1k файлов, были созданы и количество папок варьируется.
На нижнем левом графике показаны столбцы ошибок, указывающие минимальное и максимальное измеренное время cat <file>
для 10 случайно выбранных файлов.
Время поиска файла
Убийственное сравнение - это время, которое нужно, cat <file>
чтобы закончить. По какой-то причине это масштабируется линейно с размером файла TAR (приблизительно байт на файл x количество файлов) для архивного монтирования при постоянном времени в ratarmount. Это делает его похожим на то, что archivemount вообще не поддерживает поиск.
Для сжатых файлов TAR это особенно заметно.
cat <file>
занимает в два раза больше времени, чем монтирование всего файла .tar.bz2! Например, для TAR с 10k пустых (!) Файлов требуется 2,9 с для монтирования с помощью archivemount, но в зависимости от файла, к которому осуществляется доступ, доступ с помощью cat
занимает от 3 мс до 5 с. Время, которое требуется, зависит от положения файла внутри TAR. Файлы в конце TAR требуют больше времени для поиска; указывает, что эмулируется «поиск», и все содержимое в TAR до чтения файла.
То, что получение содержимого файла может занять более чем вдвое больше времени, чем монтирование всего TAR, само по себе неожиданно. По крайней мере, он должен закончиться за то же время, что и монтаж. Одним из объяснений может быть то, что файл эмулируется для поиска более одного раза, может быть, даже трижды.
Ratarmount, похоже, всегда получает одинаковое количество времени, чтобы получить файл, потому что он поддерживает истинный поиск. Для сжатых TAR bzip2 он даже ищет блок bzip2, адреса которого также хранятся в индексном файле. Теоретически, единственная часть, которая должна масштабироваться с количеством файлов, - это поиск в индексе, который должен масштабироваться с O (log (n)), потому что он сортируется по пути и имени файла.
След памяти
В общем, если у вас есть более 20 тыс. Файлов внутри TAR, то объем памяти ratarmount будет меньше, поскольку индекс записывается на диск по мере его создания и, следовательно, в моей системе имеет постоянный объем памяти примерно 30 МБ.
Небольшое исключение - это бэкэнд декодера gzip, который по какой-то причине требует больше памяти, поскольку размер gzip увеличивается. Эти накладные расходы памяти могут быть индексом, необходимым для поиска внутри TAR, но необходимы дальнейшие исследования, поскольку я не писал этот бэкэнд.
Напротив, archivemount сохраняет весь индекс, который составляет, например, 4 ГБ для файлов 2M, полностью в памяти до тех пор, пока смонтирован TAR.
Время монтажа
Моя любимая особенность - возможность ratarmount смонтировать TAR без заметной задержки при любой последующей попытке. Это связано с тем, что индекс, который отображает имена файлов в метаданные и положение в TAR, записывается в файл индекса, созданный рядом с файлом TAR.
Требуемое время для монтирования ведет себя странно в архиве. Начиная примерно с 20 тыс. Файлов, он начинает масштабироваться квадратично, а не линейно по отношению к количеству файлов. Это означает, что, начиная примерно с 4М файлов, ratarmount начинает работать намного быстрее, чем архивирование, даже если для небольших файлов TAR это происходит в 10 раз медленнее! Опять же, для небольших файлов не имеет большого значения, требуется ли 1 или 0,1 секунды для монтирования tar (в первый раз).
Время монтирования сжатых файлов bz2 является наиболее сопоставимым во все времена. Это очень вероятно, потому что это связано со скоростью декодера bz2. Ratarmount здесь примерно в 2 раза медленнее. Я надеюсь, что в ближайшем будущем ratarmount станет явным победителем благодаря распараллеливанию декодера bz2, что даже для моей 8-летней системы может привести к ускорению в 4 раза.
Время получать метаданные
При простом перечислении всех файлов find
внутри TAR (команда find также вызывает статистику для каждого файла !?), ratarmount в 10 раз медленнее, чем archivemount для всех проверенных случаев. Я надеюсь улучшить это в будущем. Но в настоящее время это выглядит как проблема дизайна из-за использования Python и SQLite вместо чистой программы на Си.