Proto Explanation
Sergey CheparukhinКаждый раз, когда разговор заходит про бинарные форматы в разработке и аналитике (но и не только), я сразу же рекомендую прочитать Designing Data Intensive Applications ("Высоконагруженные приложения. Программирование, масштабирование, поддержка" на русском). Причем достаточно даже первых 90 страниц (но вы все равно дочитаете до конца, написано очень круто).
Коротко про Protobuf – бинарный формат для структурированных данных. Исходя из их структуры вы задаете схему вида:
message DataPoint {
repeated float features = 1;
int32 target = 2;
}
Простенькая схема для хранения данных готова.
Есть реализации под многие языки программирования, в том числе под наш любимый Python.
Главный минус (как и любого бинарного формата) – просто так не почитаешь, как например те же json-ы или CSV.
Но главный плюс – занимает меньше места и сохраняет точность дробных чисел.
Сравним на примере выше.
Допустим, мы храним 100 float признаков, и нам важны все цифры до 5 знака после запятой. Получается, что одно число это как минимум 7 символов (1 для целой части, 1 дли точки, 5 для дробной). 100 раз по 7 символов + 100 разделителей и односимвольный таргет. Можно грубо оценить один дата поинт в 801 символ, что в utf-8 801 байт.
А теперь Protobuf. В данном случае нам понадобится байт на описание каждого поля (2) + 1 байт на кодирование длины массива признаков + 100 раз по 4 байта (float32 же) на сами признаки + 4 байта на таргет (int32 опять же).
Итого 407 байтов против 801.