Stockdb - БД на эрланге для трейдинговых тиков

Aug 29, 2012 15:48

Хочу немного рассказать про нашу базу данных stockdb которую пришлось написать для хранения биржевых данных.

От брокера приходят котировки и информация о трейдах. Их много: до 400 тыс в сутки по одной акции. Все базы данных, которые есть, не справляются, потому что они хранят данные очень некомпактно и ни на один диск это не влезет.

При этом сами данные устроены так, что жмутся очень хорошо.



Они представляют из себя список пар (цена,объём) одинаковой длины, приходящий до нескольких раз в секунду. Длина списка составляет от 2 до 40 элементов.

Очень здорово помог Андрюха Аксенов, подсказав как именно стоит укладывать данные, что бы получить их сжатие.

В упрощенном виде схема выглядит так:
1) все цены умножаем на 100 и приводим к инту
2) включаем поколоночную компрессию
3) в начале каждой строки отводим бит столько, сколько у нас чисел в строке (это значение не меняется)
4) для каждого числа в строке пишем бит 0, если оно не поменялось, пишем бит 1, если менялось
5) дальше для всех тех, которые поменялись, пишем leb128-кодированную знаковую дельту.
6) не забываем про строчки, которые не сжаты, а записаны как есть

Дальше мы придумали небольшую хитрость: некодированная строка пишется каждые 5 минут, а её оффсет в файле пишется в карту в начале файла. Учитывая, что данные бьются: один файл за одни сутки для одного инструмента, то количество пятиминуток известно заранее.

Таким образом нам не надо читать весь файл, что бы узнать карту записи, мы только смотрим в первый килобайт и там написано, в какое время была запись, в какое не было.

Результаты такие: 400 мегайбайт занимает дневная CSV по одному инструменту, 4 мегабайта занимает сжатый файл.

Очень важной особенностью этого формата является то, что он appendable. Берем и просто дописываем в конец ещё чуть-чуть. Не надо открывать никакие контейнеры, менять оффсеты (кроме опционального индекса фиксированного размера, о котором я говорил).

Теперь про скорость. На C заимплеменчена функция «прочти следующую строчку». Разница между версией на эрланге и на С примерно такая: 15 мкс против 3 мкс. Остальное на эрланге, просто и удобно.

Штука работает как часы, из-за разбивания файлов по датам, позволяет делать синхронизацию простым rsync-ом.

Основную работу в stockdb по кодированию проделал мой коллега Данила.

stockdb, erlang

Previous post Next post
Up