Предисловие
Данный формат является экспериментальным, поэтому все что здесь представлено делайте на свой страх и риск! Перед конвертации вашего мира убедитесь что сделали резервную копию. Автор не несет ответственности за ваши действия!
Что такое Linear?
По сравнению с Anvil форматом (или
Особенности
Какие проблемы имеет Anvil формат
Существует 3 основные проблемы:
1. Каждый чанк сжимается индивидуально
Linear сжимает весь файл региона за один раз, достигая превосходной степени сжатия.
2. Anvil использует устаревший алгоритм сжатия (zlib)
zlib очень старый, медленный и предлагает гораздо худший коэффициент сжатия, чем zstd. (Сравнение скорости zlib и zstd)
3. Каждый чанк сжимается до 4096 байт
Anvil сжимает каждый чанк до 4096. Так что если сжатый чанк в итоге составит всего 5000 байт... он займет
Почему стоит использовать Linear?
Тот факт, что каждый чанк хранится в Anvil отдельно, означает, что у сжатия нет возможности «изучить» окружающие данные. Таким образом, коэффициент сжатия крайне мал. Linear решает эту проблему, сжимая фрагменты
Структура Linear
С недавнего времени автор выпустил 2 версию Linear, созданную для дальнейшей оптимизации хранения и производительности файлов регионов Minecraft.
Linear v2 состоит из следующих компонентов:
Superblock (26 байт)
Суперблок содержит метаданные о файле и имеет следующую структуру:
Chunk Existence Bitmap (128 байт)
Предостережение автора: Пожалуйста, не полагайтесь на эту функцию, реализация Java сломана и требует исправления, прежде чем на нее можно будет положиться.
Chunk Existence Bitmap - 1024-битная битовая карта, которая показывает, существует ли чанк или нет. Она сериализуется в 128 байт, где каждый бит обозначает существование чанка. Это позволяет быстро проверить существование чанка без распаковки всего файла.
NBT Features
NBT features содержит дополнительные возможности и оптимизации, применяемые к данным NBT. Это сериализованный словарь со следующей структурой:
Bucket Sizes
Bucket sizes содержит размеры, уровни сжатия и xxhash64 каждого bucket в сетке. Каждая запись о размере bucket имеет следующую структуру:
Этот раздел повторяется для каждого bucket в сетке (
Compressed Data
Compressed Data содержит фактические данные чанка и метаданные. Он разделен на bucket в соответствии с размером сетки. Каждый bucket сжимается с помощью алгоритма Zstandard (zstd).
Footer (8 бит)
Footer содержит подпись для проверки целостности файла:
Grid System
Grid System делит регион на более мелкие подрегионы для более эффективного сжатия. Размер сетки может быть 1, 2, 4, 8, 16 или 32. Каждая ячейка сетки содержит подмножество чанков региона.
Chunk Data Structure
Внутри каждого Bucket хранятся чанки со следующей структурой:
Если чанк не существует, сохраняются только размер (0) и временная метка.
Поддержка Linear file format
Стандартные ядра по типу Spigot, Paper не имеют поддержку Linear, но существуют форки ядра Paper, которые имеют поддержку:
Послесловие
В связи с ростом количества новых проектов возрастает нужда не только в хорошем процессоре или количестве оперативной памяти, но и в большом объеме дискового пространства, а это очень сильно “бьет по карману” владельца. Уже сейчас, на версии 1.21+ прогрузив 30к чанков радиусом, вес мира составит около 153GB. Благодаря Linear, владельцы серверов смогут сэкономить на покупке дискового пространства, путем конвертации их мира с
Я считаю что за данным форматом будущее и в дальнейшем этот проект будет развиваться и нуждаться все сильнее и сильнее с каждым годом (технологии меняются => растут системные требования).
Более детальное описание и скрипты для конвертации
Данный формат является экспериментальным, поэтому все что здесь представлено делайте на свой страх и риск! Перед конвертации вашего мира убедитесь что сделали резервную копию. Автор не несет ответственности за ваши действия!
Что такое Linear?
По сравнению с Anvil форматом (или
.mca
), Linear - авторский проект xymb-endcrystalme, целью которого является сохранить как можно больше дискового пространства за счет грамотного сжатия информации в чанках. Он был создан изначально для его собственного проекта Endcrystal.me, но в последствии стал доступен всем в виде патча, который был в последствии включен во многие проекты.Особенности
- Экономит около 50% места по сравнению с Anvil (50% в Owerworld и около 95% в Nether и End)
- Считывает и записывает целые файлы, так что на HDD это будет быстрее, чем
.mca
(намного меньше операций ввода-вывода (IOPS), чем.mca
) - Заменяет символические ссылки файлами, что позволяет кэшировать файлы на жестком диске
- Использует немного больше оперативной памяти, чем Anvil (так как хранит целый файл региона в ОЗУ)
- Для доступа к отдельным фрагментам требуется хранить весь файл региона в памяти.
- Гораздо более простой формат - около 600 строк кода против около 1000 LoC (Lines of Code) для Anvil
Какие проблемы имеет Anvil формат
Существует 3 основные проблемы:
1. Каждый чанк сжимается индивидуально
Linear сжимает весь файл региона за один раз, достигая превосходной степени сжатия.
2. Anvil использует устаревший алгоритм сжатия (zlib)
zlib очень старый, медленный и предлагает гораздо худший коэффициент сжатия, чем zstd. (Сравнение скорости zlib и zstd)
3. Каждый чанк сжимается до 4096 байт
Anvil сжимает каждый чанк до 4096. Так что если сжатый чанк в итоге составит всего 5000 байт... он займет
4096 * 2
на диске, заполнив пустое пространство нулями. Это приводит к потере (в среднем) 1 МБ на полный файл региона 32 x 32
.Почему стоит использовать Linear?
Тот факт, что каждый чанк хранится в Anvil отдельно, означает, что у сжатия нет возможности «изучить» окружающие данные. Таким образом, коэффициент сжатия крайне мал. Linear решает эту проблему, сжимая фрагменты
4 х 4
как единый поток сжатия, что позволяет достичь как производительности, так и степени сжатия.Структура Linear
С недавнего времени автор выпустил 2 версию Linear, созданную для дальнейшей оптимизации хранения и производительности файлов регионов Minecraft.
Linear v2 состоит из следующих компонентов:
Superblock
(26 байта)Chunk Existence Bitmap
(128 байта)NBT Features
Bucket Sizes
Compressed Data
Footer
(8 байта)
Superblock (26 байт)
Суперблок содержит метаданные о файле и имеет следующую структуру:
Смещение | Размер | Тип | Описание |
---|---|---|---|
0 | 8 | uint64 | Сигнатура (0xc3ff13183cca9d9a) |
8 | 1 | uint8 | Версия (2) |
9 | 8 | uint64 | Временная метка |
17 | 1 | int8 | Размер сетки |
18 | 4 | int32 | Регион X |
22 | 4 | int32 | Регион Z |
Chunk Existence Bitmap (128 байт)
Предостережение автора: Пожалуйста, не полагайтесь на эту функцию, реализация Java сломана и требует исправления, прежде чем на нее можно будет положиться.
Chunk Existence Bitmap - 1024-битная битовая карта, которая показывает, существует ли чанк или нет. Она сериализуется в 128 байт, где каждый бит обозначает существование чанка. Это позволяет быстро проверить существование чанка без распаковки всего файла.
NBT Features
NBT features содержит дополнительные возможности и оптимизации, применяемые к данным NBT. Это сериализованный словарь со следующей структурой:
Смещение | Размер | Тип | Описание |
---|---|---|---|
0 | 1 | uint8 | Длина ключа |
1 | - | string | Ключ |
- | 4 | uint32 | Значение |
... | ... | ... | (Повторяется для каждой пары ключ-значение) |
- | 1 | uint8 | Конечный маркер (0) |
Bucket Sizes
Bucket sizes содержит размеры, уровни сжатия и xxhash64 каждого bucket в сетке. Каждая запись о размере bucket имеет следующую структуру:
Смещение | Размер | Тип | Описание |
---|---|---|---|
0 | 4 | uint32 | Размер Bucket |
4 | 1 | int8 | Уровень сжатия |
5 | 8 | uint64 | Bucket xxhash64 |
Этот раздел повторяется для каждого bucket в сетке (
grid_size * grid_size
раз).Compressed Data
Compressed Data содержит фактические данные чанка и метаданные. Он разделен на bucket в соответствии с размером сетки. Каждый bucket сжимается с помощью алгоритма Zstandard (zstd).
Footer (8 бит)
Footer содержит подпись для проверки целостности файла:
Смещение | Размер | Тип | Описание |
---|---|---|---|
0 | 8 | uint64 | Сигнатура (0xc3ff13183cca9d9a) |
Grid System
Grid System делит регион на более мелкие подрегионы для более эффективного сжатия. Размер сетки может быть 1, 2, 4, 8, 16 или 32. Каждая ячейка сетки содержит подмножество чанков региона.
Chunk Data Structure
Внутри каждого Bucket хранятся чанки со следующей структурой:
Смещение | Размер | Тип | Описание |
---|---|---|---|
0 | 4 | uint32 | Размер чанка (включая метаданные) |
4 | 8 | uint64 | Временная метка чанка |
12 | - | bytes | Данные чанка (NBT) |
Если чанк не существует, сохраняются только размер (0) и временная метка.
Поддержка Linear file format
Стандартные ядра по типу Spigot, Paper не имеют поддержку Linear, но существуют форки ядра Paper, которые имеют поддержку:
- LinearPaper - в данный момент не обновляется и имеет поддержку только Linear V1
- Leaves - развивающийся проект и часто обновляющийся. Поддерживает Linear V2
- Leaf - так же, как и Leaves, поддерживающийся и развивающийся проект. На момент написания статьи все еще имеет поддержку Linear V1
- Luminol - форк Folia, так же развивающийся проект. Поддержка Linear V2
Послесловие
В связи с ростом количества новых проектов возрастает нужда не только в хорошем процессоре или количестве оперативной памяти, но и в большом объеме дискового пространства, а это очень сильно “бьет по карману” владельца. Уже сейчас, на версии 1.21+ прогрузив 30к чанков радиусом, вес мира составит около 153GB. Благодаря Linear, владельцы серверов смогут сэкономить на покупке дискового пространства, путем конвертации их мира с
.mca
в .linear
. Я считаю что за данным форматом будущее и в дальнейшем этот проект будет развиваться и нуждаться все сильнее и сильнее с каждым годом (технологии меняются => растут системные требования).
Более детальное описание и скрипты для конвертации
.mca
в .linear
и обратно можете найти на github-е проекта