---
failures:
async_db::test::test_write_read
async_db::test::test_write_read_stream
thread 'async_db::test::test_write_read' panicked at 'get: "UnexpectedEnd { additional: 1 }
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