Хочу немного рассказать про нашу
базу данных stockdb которую пришлось написать для хранения биржевых данных.
От брокера приходят котировки и информация о трейдах. Их много: до 400 тыс в сутки по одной акции. Все базы данных, которые есть, не справляются, потому что они хранят данные очень некомпактно и ни на один диск это не влезет.
При этом сами данные устроены так, что жмутся очень хорошо.
Они представляют из себя список пар (цена,объём) одинаковой длины, приходящий до нескольких раз в секунду. Длина списка составляет от 2 до 40 элементов.
Очень здорово помог
Андрюха Аксенов, подсказав как именно стоит укладывать данные, что бы получить их сжатие.
В упрощенном виде схема выглядит так:
1) все цены умножаем на 100 и приводим к инту
2) включаем поколоночную компрессию
3) в начале каждой строки отводим бит столько, сколько у нас чисел в строке (это значение не меняется)
4) для каждого числа в строке пишем бит 0, если оно не поменялось, пишем бит 1, если менялось
5) дальше для всех тех, которые поменялись, пишем
leb128-кодированную знаковую дельту.
6) не забываем про строчки, которые не сжаты, а записаны как есть
Дальше мы придумали небольшую хитрость: некодированная строка пишется каждые 5 минут, а её оффсет в файле пишется в карту в начале файла. Учитывая, что данные бьются: один файл за одни сутки для одного инструмента, то количество пятиминуток известно заранее.
Таким образом нам не надо читать весь файл, что бы узнать карту записи, мы только смотрим в первый килобайт и там написано, в какое время была запись, в какое не было.
Результаты такие: 400 мегайбайт занимает дневная CSV по одному инструменту, 4 мегабайта занимает сжатый файл.
Очень важной особенностью этого формата является то, что он appendable. Берем и просто дописываем в конец ещё чуть-чуть. Не надо открывать никакие контейнеры, менять оффсеты (кроме опционального индекса фиксированного размера, о котором я говорил).
Теперь про скорость. На C заимплеменчена функция «прочти следующую строчку». Разница между версией на эрланге и на С примерно такая: 15 мкс против 3 мкс. Остальное на эрланге, просто и удобно.
Штука работает как часы, из-за разбивания файлов по датам, позволяет делать синхронизацию простым rsync-ом.
Основную работу в stockdb по кодированию проделал мой коллега Данила.