src | ||
.gitignore | ||
bench.txt | ||
Cargo.lock | ||
Cargo.toml | ||
LICENSE | ||
README.md |
chgk_ledb
Утилита загружающая базу данных ЧГК вопросов из ZIP файла в JSON формате в базу данных.
Исходный файл вопросов: json.zip
, кодировка UTF-8
.
При загрузке базы информация о пакете(файле/турнире) дублируется в каждом вопросе.
Выходной формат данных
Для хранения данных используется bincode и zstd.
Данные вопросов в виде структуры сериализуются через bincode
в бинарные данные и сжимаются zstd
. Каждый вопрос сериализуется и сжимается отдельно.
В файле сжатые данные храняться последовательно, после заголовка файла.
Заголовок файла
В заголовке хранятся только смещения каждого сжатого блока данных, и дополнительно, смещение указывающее на конец файла.
Смещение указывается в виде 32-битного беззнакового целового числа u32
, сохраненного в виде 4-х байтов от младшего к старшему (Little Endian).
Пример заголовка:
00: 10 00 00 00
04: 1A 00 00 00
08: 2E 00 00 00
0А: 3A 00 00 00
данные:
10: 00 00 00 00 00 00 00 00 00 00
1A: 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00
2E: 00 00 00 00 00 00 00 00 00 00
00 00
3A: (EOF)
В этом примере сохранены 3 записи:
- смещение 0x10, длина 10 байт
- смещение 0x1A, длина 20 байт
- смещение 0x2E, длина 12 байт
Размер файла - 58 байт (0x3A), размер заголовка 16 байт (0x10).
Чтение данных
Пусть размер записи заголовка в байтах = M
, количество записей в файле = N
.
Тогда для того чтобы:
- Найти
N
, нужно прочитать первую запись (M
байт) в начале файла и разделить её значение наM
; - Найти элемент данных с индексом
i
, нужно последовательно прочитать 2 записи (M * 2
байт), начиная c индексаi
(по смещению в файле:i * M
). Смещением будет значение по индексуi
, длинной - разница между значениями по индексамi + 1
иi
.
Далее для каждого вопроса отдельно предполагается распаковка данных через zstd
и десериализация через bincode
.
Ссылки
- Источник вопросов: http://db.chgk.info
- Копия файлов базы вопросов: https://gitlab.com/b4tman/db_chgk
- Конвертор в JSON: https://gitea.b4tman.ru/b4tman/chgk_txt2json