SlideShare a Scribd company logo
1 of 49
Download to read offline
1
2
карты
Memory-mapped storage
Ещё один подход
к сериализации данных
Дмитрий Прокопцев
Яндекс.Карты
C++ party, Новосибирск
3
Краткое содержание
!  Зачем?
!  Ключевые идеи
!  Алгоритм сериализации
!  Стандартные контейнеры
!  Эффективность
4
Чем не подошли
существующие?
5
Boost.Serialization
class person {
private:
std::string first_name;
std::string last_name;
unsigned age;
public:
template<class Archive>
void serialize(Archive& a, unsigned version) {
a & first_name;
a & last_name;
a & age;
}
};
// serialization
boost::archive::text_oarchive(std::ofstream(filename))
<< person { «john», «smith», 25 });
// deserialzation
person p;
boost::archive::text_iarchive(std::ifstream(filename)) >> p;
6
Boost.Serialization
!  Приятный интерфейс;
!  Поддержка STL-контейнеров;
!  Множество форматов вывода;
!  Есть какое-то версионирование.
!  Большую часть кода для версионирования нужно писать
руками.
7
Google Protobuf
// person.proto
package example;
message person {
required string first_name = 1;
required string last_name = 2;
required int32 age = 3;
}
// serialization
example::person p;
p.set_first_name(«john»);
p.set_last_name(«smith»);
p.set_age(25);
std::ofstream out(filename);
p.SerializeToOstream(&out);
// deserialization
std::ifstream in(filename);
example::person p;
p.ParseFromIstream(&in);
8
Google Protobuf
!  Расширяемая (если заранее подумать) в обе стороны;
!  Поддержка множества платформ и языков
программирования.
!  (на мой взгляд) ужасный интерфейс;
!  Необходимость кодогенерации;
!  Только repeated messages, никаких ассоциативных
контейнеров.
9
У нас своя специфика
!  Все эти библиотеки требует чтения (т.е. декодирования)
данных.
!  Цикл «создали – скопировали – прочитали»;
!  Данные создаются редко, читаются постоянно;
!  Данных много (до 100 GB).
10
Хочется предельно уменьшить время чтения:
до O(1)
11
Несколько
полезных мыслей
12
Чтение
!  «Чтение данных» -- это на самом деле две операции:
–  перемещение данных с диска в память;
–  перекодировка в формат, в котором с ними удобно
работать.
!  Чтения с диска можно избежать, если использовать mmap*
*если данные уже есть в дисковом кэше
13
Типичная сериализация
struct person { std::string first_name, last_name; unsigned age; };
4	
  
«John»	
  
5	
  
«Smith»	
  
25	
  
size	
  
data	
  
size	
  
data	
  
first_name	
  
last_name	
  
age	
  
14
Структура в памяти
struct person { std::string first_name, last_name; unsigned age; };
<ptr>	
  
4	
  
<ptr>	
  
5	
  
25	
  
ptr	
  
size	
  
ptr	
  
size	
  
first_name	
  
last_name	
  
age	
  
«John0»	
  
«Smith0»	
  
Фиксированная	
  
часть	
  
Варьирующаяся	
  
часть	
  
15
Структура в памяти
!  Варьирующаяся часть
–  Находится в heap-е;
–  Содержит реальные данные.
!  Фиксированная часть
–  Содержит ссылки на данные в heap-е;
–  Имеет заранее известный layout и размер.
16
Структура в памяти
!  Если мы не хотим тратить время на декодирование –
структура данных в файле должна повторять структуру
данных в памяти,
–  т.е. также делиться на две части.
!  Писать данные нужно в два прохода:
–  сперва варьирущуюся часть,
–  затем фиксированную.
–  два прохода по объектам в памяти,
–  на диск пишем подряд.
17
Как хранить ссылки
!  Мы не знаем, с какого адреса будет начинаться
отображенный файл; абсолютные адреса писать нельзя.
!  «Наивный» подход: писать смещения от начала потока;
–  нужно везде помнить это начало.
!  Более правильный подход: писать смещения относительно
ссылки.
18
Как хранить ссылки
!  Данные не привязаны к своему положению в памяти;
!  Для разыменования ссылки не нужно дополнительной
информации.
‘J’	
   ‘o’	
   ‘h’	
   ‘0’	
  ‘n’	
   -­‐5	
  
-­‐5	
  
19
Строка на горизонте
!  Один reinterpret_cast – и у нас есть строка.
–  с похожим на std::string интерфейсом!
class ro_string {
private:
ssize_t m_ofs;
size_t m_size;
public:
const char* data() const { return (const char*) &m_ofs + m_ofs; }
size_t size() const { return m_size; }
typedef const char* const_iterator;
const_iterator begin() const { return data(); }
const_iterator end() const { return data() + size(); }
bool operator == (const string&) const { /*...*/ }
bool operator < (const string&) const { /*...*/ }
// more fancy methods
};
20
Появляется двойственность
!  Чтобы писать:
struct wperson {
std::string first_name;
std::string last_name;
unsigned age;
};
!  Чтобы пользоваться:
struct rperson {
ro_string first_name;
ro_string last_name;
unsigned age;
};
21
Нас спасут шаблоны!
struct Standalone {};
struct Mapped {};
template<class Tag> class string;
template<> class string<Standalone>: public std::string {};
template<> class string<Mmapped>: public ro_string {};
22
Нас спасут шаблоны!
!  Создаём person<Standalone> и заполняем его;
!  Сохраняем его в файл;
!  Отображаем его в память (на другой машине);
! reinterpret_cast<person<Mmapped>>(pos);
!  PROFIT!
template<class Tag>
struct person {
string<Tag> first_name;
string<Tag> last_name;
unsigned age;
};
23
Ключевые идеи, ещё раз
!  Все данные органично делятся на две части:
–  Фиксированную (поля структур и классов);
–  Варьирующуюся (реальные данные, на которые ссылается
фиксированная часть);
!  Писать данные нужно в два прохода
(сперва варьирующуся часть, потом фиксированную);
!  Все смещения – относительные;
!  Все данные – шаблоны, параметризуемые стратегией
размещения.
24
Как мы пишем
25
Что можно сериализовать
!  POD-ы;
!  Структуры, все поля которых сериализуемы;
!  Контейнеры, содержащие сериализуемые данные.
template<class Tag> struct My {
map<Tag, string<Tag>, vector<Tag, string<Tag>>> m;
};
26
Пользовательские структуры
!  Сперва пишем все варьирующиеся части всех полей;
!  Потом пишем все фиксированные части всех полей.
–  Не забываем о выравнивании.
!  Нужна интроспекция полей структуры:
template<class Tag> struct My {
unsigned x;
string<Tag> str;
vector<Tag, string<Tag>> v;
template<class A>
void traverseFields(A a) { a(x)(str)(v); }
};
27
Подводные грабли
!  Можно перепутать порядок следования полей;
–  следим, чтобы адреса полей монотонно возрастали;
!  Можно забыть какое-то поле;
–  увы, тут защититься нельзя.
–  ждем интроспекции полей классов где-нибудь
в районе С++22.
28
Контейнеры
!  Все контейнеры непохожи друг на друга;
!  Для каждого контейнера сериализацию приходится писать
руками.
29
Стандартные
контейнеры
30
vector
T	
   T	
   T	
   T	
  
T’s	
  data...	
  
vector<T>’s	
  data	
  
offset	
  
size	
  
vector<T>	
  
31
vector
!  Варьирующаяся часть:
–  Сначала пишем варьирующуюся часть для всех элементов
вектора;
–  Затем пишем фиксированную часть для всех элементов
вектора.
!  Фиксированная часть:
–  Просто пишем смещение до начала данных и размер.
32
deque, list, rope, slist...
!  Отличаются от вектора различным поведением
модифицирующих операций;
! readonly-интерфейс либо такой же, как у вектора, либо
хуже;
!  В примапленном файле всё равно ничего изменять нельзя.
!  Не нужны.
33
map, set
!  Если не рассматривать модифицирующие операции,
остаётся поиск за O(log N).
!  Сортированный вектор + бинарный поиск
34
unordered_map, unordered_set
class unordered_set {
vector<vector<T>> buckets;
public:
iterator find(const T& k) {
for (T& t: buckets[hash(k) % buckets.size()]
if (t == k) return &t;
return end();
}
};
T	
  
T	
  
T	
   T	
  
buckets	
  
35
unordered_map, unordered_set
class unordered_set {
vector<T> items;
vector<pair<T*, size_t>> buckets;
public:
iterator find(const T& k) {
const auto& bkt = buckets[hash(k) % buckets.size()];
for (T *b = bkt.first, *e = b + bkt.second; b != e; ++b)
if (*b == k) return &t;
return end();
}
};
T	
   T	
   T	
   T	
  
buckets	
  
items	
  
36
unordered_map, unordered_set
class unordered_set {
vector<T> items;
vector<T*> buckets;
public:
iterator find(const T& k) {
size_t bkt = hash(k) % (buckets.size() – 1);
for (T *b = buckets[bkt], *e = buckets[bkt+1]; b != be; ++b)
if (*b == k) return &t;
return end();
}
};
T	
   T	
   T	
   T	
  
buckets	
  
items	
  
37
unordered_map, unordered_set
T	
   T	
   T	
   T	
  
T’s	
  data...	
  
offset	
  
bucket	
  count	
  
ofs	
   ofs	
   ofs	
   ofs	
   ofs	
   ofs	
  
buckets	
  
unordered_set<T>’s	
  data	
  unordered_set<T>	
  
38
Эффективность
39
Схема измерений
!  Создаём матрицу 5000х1000 десятисимвольных строк;
! Сериализуем её в файл;
! Десериализуем обратно;
!  Обходим в случайном порядке.
!  Проверяем boost::archive::binary_archive и protobuf.
40
Схема измерений
// protobuf.proto
package perftest;
message InnerMessage { repeated string item = 1; };
message OuterMessage { repeated InnerMessage row = 1; };
// boost.h
struct Message {
std::vector<std::vector<std::string>> v;
template<class Archive>
void serialize(Archive& a, unsigned) { a & v; }
};
// mms.h
template<class Tag>
struct Message {
mms::vector<Tag, mms::vector<Tag, mms::string<Tag>>> v;
template<class Action>
void traverseFields(Action a) { a(v); }
};
41
Результаты измерений
!  Как мы и хотели, чтения на приборах вообще не видно;
!  Скорость доступа к элементам почти такая же, как и для
STL-ных контейнеров;
–  чуть-чуть меньше из-за относительных смещений.
Boost	
   Protobuf	
   Mms	
  
Запись,	
  мс	
   440	
   460	
   1200	
  
Чтение,	
  мс	
   1200	
   1100	
   0	
  
Обход,	
  мс	
   1300	
   2000	
   1400	
  
Размер	
  файла,	
  Мб	
   85	
   56	
   156	
  
42
Результаты измерений
!  Запись почти в три раза дольше;
!  Полученный файл в 2..4 раза больше;
–  но всё равно меньше, чем для STL (в отдельных случаях до
10 раз).
Boost	
   Protobuf	
   Mms	
  
Запись,	
  мс	
   440	
   460	
   1200	
  
Чтение,	
  мс	
   1200	
   1100	
   0	
  
Обход,	
  мс	
   1300	
   2000	
   1400	
  
Размер	
  файла,	
  Мб	
   85	
   56	
   156	
  
43
Ложка дёгтя
!  Нет инкрементальной записи;
!  Привязка к платформе;
!  Никакой расширяемости;
–  миграция на новый формат данных – занятие
нетривиальное.
44
Версии данных
!  Можно посчитать некоторое число («версию данных»):
–  для POD-ов – хэш от его typeid(T).name() и размера;
–  для структур – полиномиальный хэш от версий всех полей;
–  для контейнеров – хэш от типа контейнера и версии данных
в нём.
!  При сериализации сохраняем эту версию (один раз на
файл);
!  При десериализации проверяем версию, при несовпадении
ругаемся.
45
Вместо заключения
!  Описание сериализуемых данных на C++ (никакой
кодогенерации);
!  Привычный STL-like интерфейс;
!  Моментальное чтение;
!  Скорость доступа к элементам – (почти) как в STL.
!  Хорошая локальность данных.
46
Кому может быть полезно?
!  Если есть релизный цикл «создали – опубликовали –
используем»;
!  Если данных много и хочется сэкономить на декодировании;
!  Если данные структурированы.
!  Большой справочник адресов;
!  Словарь для autocompletion-а;
!  Дамп lurkmore;
!  ...etc...
47
Спасибо за внимание!
48
Дмитрий Прокопцев
dprokoptsev@yandex-team.ru
http://github.com/dprokoptsev
Яндекс.Карты,
старший разработчик
49
https://github.com/dprokoptsev/mms

More Related Content

What's hot

Technopolis.NoSQL 03 Cassandra
Technopolis.NoSQL 03 CassandraTechnopolis.NoSQL 03 Cassandra
Technopolis.NoSQL 03 CassandraVadim Tsesko
 
Hadoop > cascading -> cascalog (short version)
Hadoop  > cascading -> cascalog (short version)Hadoop  > cascading -> cascalog (short version)
Hadoop > cascading -> cascalog (short version)Andrew Panfilov
 
Using perl6-pod
Using perl6-podUsing perl6-pod
Using perl6-podzagru
 
C++ STL & Qt. Занятие 06.
C++ STL & Qt. Занятие 06.C++ STL & Qt. Занятие 06.
C++ STL & Qt. Занятие 06.Igor Shkulipa
 
Perl6pod devconf
Perl6pod devconfPerl6pod devconf
Perl6pod devconfzagru
 
MySQL: Есть ли жизнь после 1 млрд. записей.
MySQL: Есть ли жизнь после 1 млрд. записей.MySQL: Есть ли жизнь после 1 млрд. записей.
MySQL: Есть ли жизнь после 1 млрд. записей.MageCloud
 
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6Nikolay Samokhvalov
 
Большой брат помогает тебе
Большой брат помогает тебеБольшой брат помогает тебе
Большой брат помогает тебеTatyanazaxarova
 
C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.Igor Shkulipa
 
Hadoop -> Cascading -> Cascalog
Hadoop -> Cascading -> CascalogHadoop -> Cascading -> Cascalog
Hadoop -> Cascading -> CascalogAndrew Panfilov
 
Александр Крашенинников "Hadoop High Availability: опыт Badoo"
Александр Крашенинников "Hadoop High Availability: опыт Badoo"Александр Крашенинников "Hadoop High Availability: опыт Badoo"
Александр Крашенинников "Hadoop High Availability: опыт Badoo"IT Event
 
Лекция 10. Apache Mahout
Лекция 10. Apache MahoutЛекция 10. Apache Mahout
Лекция 10. Apache MahoutTechnopark
 
Distributed erlang
Distributed erlangDistributed erlang
Distributed erlangYuri Zhloba
 
Hacking PostgreSQL. Обзор исходного кода
Hacking PostgreSQL. Обзор исходного кодаHacking PostgreSQL. Обзор исходного кода
Hacking PostgreSQL. Обзор исходного кодаAnastasia Lubennikova
 
Использование библиотеки анализа кода OpenC++: модификация, улучшение, исправ...
Использование библиотеки анализа кода OpenC++: модификация, улучшение, исправ...Использование библиотеки анализа кода OpenC++: модификация, улучшение, исправ...
Использование библиотеки анализа кода OpenC++: модификация, улучшение, исправ...Tatyanazaxarova
 
Лекция 12. Spark
Лекция 12. SparkЛекция 12. Spark
Лекция 12. SparkTechnopark
 
Redis: возможности, выгоды, примеры использования
Redis: возможности, выгоды, примеры использованияRedis: возможности, выгоды, примеры использования
Redis: возможности, выгоды, примеры использованияAlexey Kachayev
 

What's hot (20)

Technopolis.NoSQL 03 Cassandra
Technopolis.NoSQL 03 CassandraTechnopolis.NoSQL 03 Cassandra
Technopolis.NoSQL 03 Cassandra
 
TreeDb key/value noSQL database
TreeDb key/value noSQL databaseTreeDb key/value noSQL database
TreeDb key/value noSQL database
 
Hadoop > cascading -> cascalog (short version)
Hadoop  > cascading -> cascalog (short version)Hadoop  > cascading -> cascalog (short version)
Hadoop > cascading -> cascalog (short version)
 
Using perl6-pod
Using perl6-podUsing perl6-pod
Using perl6-pod
 
C++ STL & Qt. Занятие 06.
C++ STL & Qt. Занятие 06.C++ STL & Qt. Занятие 06.
C++ STL & Qt. Занятие 06.
 
Perl6pod devconf
Perl6pod devconfPerl6pod devconf
Perl6pod devconf
 
MySQL: Есть ли жизнь после 1 млрд. записей.
MySQL: Есть ли жизнь после 1 млрд. записей.MySQL: Есть ли жизнь после 1 млрд. записей.
MySQL: Есть ли жизнь после 1 млрд. записей.
 
Cassandra
CassandraCassandra
Cassandra
 
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
 
Большой брат помогает тебе
Большой брат помогает тебеБольшой брат помогает тебе
Большой брат помогает тебе
 
C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.
 
Hadoop -> Cascading -> Cascalog
Hadoop -> Cascading -> CascalogHadoop -> Cascading -> Cascalog
Hadoop -> Cascading -> Cascalog
 
Александр Крашенинников "Hadoop High Availability: опыт Badoo"
Александр Крашенинников "Hadoop High Availability: опыт Badoo"Александр Крашенинников "Hadoop High Availability: опыт Badoo"
Александр Крашенинников "Hadoop High Availability: опыт Badoo"
 
Tomita одесса
Tomita одессаTomita одесса
Tomita одесса
 
Лекция 10. Apache Mahout
Лекция 10. Apache MahoutЛекция 10. Apache Mahout
Лекция 10. Apache Mahout
 
Distributed erlang
Distributed erlangDistributed erlang
Distributed erlang
 
Hacking PostgreSQL. Обзор исходного кода
Hacking PostgreSQL. Обзор исходного кодаHacking PostgreSQL. Обзор исходного кода
Hacking PostgreSQL. Обзор исходного кода
 
Использование библиотеки анализа кода OpenC++: модификация, улучшение, исправ...
Использование библиотеки анализа кода OpenC++: модификация, улучшение, исправ...Использование библиотеки анализа кода OpenC++: модификация, улучшение, исправ...
Использование библиотеки анализа кода OpenC++: модификация, улучшение, исправ...
 
Лекция 12. Spark
Лекция 12. SparkЛекция 12. Spark
Лекция 12. Spark
 
Redis: возможности, выгоды, примеры использования
Redis: возможности, выгоды, примеры использованияRedis: возможности, выгоды, примеры использования
Redis: возможности, выгоды, примеры использования
 

Similar to Дмитрий Прокопцев "Memory-mapped storage: ещё один подход к сериализации данных"

лекции спрг 6_семестр (1)
лекции спрг 6_семестр (1)лекции спрг 6_семестр (1)
лекции спрг 6_семестр (1)djbelyakk
 
MongoDB в продакшен - миф или реальность?
MongoDB в продакшен - миф или реальность?MongoDB в продакшен - миф или реальность?
MongoDB в продакшен - миф или реальность?Alexey Tokar
 
C++ Базовый. Занятие 12.
C++ Базовый. Занятие 12.C++ Базовый. Занятие 12.
C++ Базовый. Занятие 12.Igor Shkulipa
 
CSS глазами машин
CSS глазами машинCSS глазами машин
CSS глазами машинRoman Dvornov
 
SPA инструменты
SPA инструментыSPA инструменты
SPA инструментыRoman Dvornov
 
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...Ontico
 
Память в Java. Garbage Collector
Память в Java. Garbage CollectorПамять в Java. Garbage Collector
Память в Java. Garbage CollectorOlexandra Dmytrenko
 
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковНикита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковSergey Platonov
 
Технологии анализа бинарного кода приложений: требования, проблемы, инструменты
Технологии анализа бинарного кода приложений: требования, проблемы, инструментыТехнологии анализа бинарного кода приложений: требования, проблемы, инструменты
Технологии анализа бинарного кода приложений: требования, проблемы, инструментыPositive Development User Group
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonovComputer Science Club
 
Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11Yandex
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6Technopark
 
На что нужно обратить внимание при обзоре кода разрабатываемой библиотеки
На что нужно обратить внимание при обзоре кода разрабатываемой библиотекиНа что нужно обратить внимание при обзоре кода разрабатываемой библиотеки
На что нужно обратить внимание при обзоре кода разрабатываемой библиотекиAndrey Karpov
 
Опыт использования Spark, Основано на реальных событиях
Опыт использования Spark, Основано на реальных событияхОпыт использования Spark, Основано на реальных событиях
Опыт использования Spark, Основано на реальных событияхVasil Remeniuk
 

Similar to Дмитрий Прокопцев "Memory-mapped storage: ещё один подход к сериализации данных" (20)

лекции спрг 6_семестр (1)
лекции спрг 6_семестр (1)лекции спрг 6_семестр (1)
лекции спрг 6_семестр (1)
 
MongoDB в продакшен - миф или реальность?
MongoDB в продакшен - миф или реальность?MongoDB в продакшен - миф или реальность?
MongoDB в продакшен - миф или реальность?
 
Js fuckworks
Js fuckworksJs fuckworks
Js fuckworks
 
Rgsu04
Rgsu04Rgsu04
Rgsu04
 
Rgsu04
Rgsu04Rgsu04
Rgsu04
 
C++ Базовый. Занятие 12.
C++ Базовый. Занятие 12.C++ Базовый. Занятие 12.
C++ Базовый. Занятие 12.
 
CSS глазами машин
CSS глазами машинCSS глазами машин
CSS глазами машин
 
SPA инструменты
SPA инструментыSPA инструменты
SPA инструменты
 
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
 
Тодуа. Сериализация и язык YAML
Тодуа. Сериализация и язык YAMLТодуа. Сериализация и язык YAML
Тодуа. Сериализация и язык YAML
 
Step cpp0201
Step cpp0201Step cpp0201
Step cpp0201
 
Память в Java. Garbage Collector
Память в Java. Garbage CollectorПамять в Java. Garbage Collector
Память в Java. Garbage Collector
 
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковНикита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
 
Технологии анализа бинарного кода приложений: требования, проблемы, инструменты
Технологии анализа бинарного кода приложений: требования, проблемы, инструментыТехнологии анализа бинарного кода приложений: требования, проблемы, инструменты
Технологии анализа бинарного кода приложений: требования, проблемы, инструменты
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov
 
Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
 
SECON'2014 - Павел Щеваев - Метаданные и автогенерация кода
SECON'2014 - Павел Щеваев - Метаданные и автогенерация кодаSECON'2014 - Павел Щеваев - Метаданные и автогенерация кода
SECON'2014 - Павел Щеваев - Метаданные и автогенерация кода
 
На что нужно обратить внимание при обзоре кода разрабатываемой библиотеки
На что нужно обратить внимание при обзоре кода разрабатываемой библиотекиНа что нужно обратить внимание при обзоре кода разрабатываемой библиотеки
На что нужно обратить внимание при обзоре кода разрабатываемой библиотеки
 
Опыт использования Spark, Основано на реальных событиях
Опыт использования Spark, Основано на реальных событияхОпыт использования Spark, Основано на реальных событиях
Опыт использования Spark, Основано на реальных событиях
 

More from Yandex

Предсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of TanksПредсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of TanksYandex
 
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...Yandex
 
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров ЯндексаСтруктурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров ЯндексаYandex
 
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров ЯндексаПредставление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров ЯндексаYandex
 
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...Yandex
 
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...Yandex
 
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Yandex
 
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...Yandex
 
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...Yandex
 
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...Yandex
 
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...Yandex
 
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...Yandex
 
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеровКак защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеровYandex
 
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...Yandex
 
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...Yandex
 
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...Yandex
 
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...Yandex
 
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...Yandex
 
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...Yandex
 
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...Yandex
 

More from Yandex (20)

Предсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of TanksПредсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of Tanks
 
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
 
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров ЯндексаСтруктурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
 
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров ЯндексаПредставление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
 
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
 
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
 
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
 
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
 
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
 
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
 
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
 
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
 
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеровКак защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
 
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
 
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
 
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
 
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
 
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
 
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
 
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
 

Дмитрий Прокопцев "Memory-mapped storage: ещё один подход к сериализации данных"

  • 1. 1
  • 2. 2 карты Memory-mapped storage Ещё один подход к сериализации данных Дмитрий Прокопцев Яндекс.Карты C++ party, Новосибирск
  • 3. 3 Краткое содержание !  Зачем? !  Ключевые идеи !  Алгоритм сериализации !  Стандартные контейнеры !  Эффективность
  • 5. 5 Boost.Serialization class person { private: std::string first_name; std::string last_name; unsigned age; public: template<class Archive> void serialize(Archive& a, unsigned version) { a & first_name; a & last_name; a & age; } }; // serialization boost::archive::text_oarchive(std::ofstream(filename)) << person { «john», «smith», 25 }); // deserialzation person p; boost::archive::text_iarchive(std::ifstream(filename)) >> p;
  • 6. 6 Boost.Serialization !  Приятный интерфейс; !  Поддержка STL-контейнеров; !  Множество форматов вывода; !  Есть какое-то версионирование. !  Большую часть кода для версионирования нужно писать руками.
  • 7. 7 Google Protobuf // person.proto package example; message person { required string first_name = 1; required string last_name = 2; required int32 age = 3; } // serialization example::person p; p.set_first_name(«john»); p.set_last_name(«smith»); p.set_age(25); std::ofstream out(filename); p.SerializeToOstream(&out); // deserialization std::ifstream in(filename); example::person p; p.ParseFromIstream(&in);
  • 8. 8 Google Protobuf !  Расширяемая (если заранее подумать) в обе стороны; !  Поддержка множества платформ и языков программирования. !  (на мой взгляд) ужасный интерфейс; !  Необходимость кодогенерации; !  Только repeated messages, никаких ассоциативных контейнеров.
  • 9. 9 У нас своя специфика !  Все эти библиотеки требует чтения (т.е. декодирования) данных. !  Цикл «создали – скопировали – прочитали»; !  Данные создаются редко, читаются постоянно; !  Данных много (до 100 GB).
  • 10. 10 Хочется предельно уменьшить время чтения: до O(1)
  • 12. 12 Чтение !  «Чтение данных» -- это на самом деле две операции: –  перемещение данных с диска в память; –  перекодировка в формат, в котором с ними удобно работать. !  Чтения с диска можно избежать, если использовать mmap* *если данные уже есть в дисковом кэше
  • 13. 13 Типичная сериализация struct person { std::string first_name, last_name; unsigned age; }; 4   «John»   5   «Smith»   25   size   data   size   data   first_name   last_name   age  
  • 14. 14 Структура в памяти struct person { std::string first_name, last_name; unsigned age; }; <ptr>   4   <ptr>   5   25   ptr   size   ptr   size   first_name   last_name   age   «John0»   «Smith0»   Фиксированная   часть   Варьирующаяся   часть  
  • 15. 15 Структура в памяти !  Варьирующаяся часть –  Находится в heap-е; –  Содержит реальные данные. !  Фиксированная часть –  Содержит ссылки на данные в heap-е; –  Имеет заранее известный layout и размер.
  • 16. 16 Структура в памяти !  Если мы не хотим тратить время на декодирование – структура данных в файле должна повторять структуру данных в памяти, –  т.е. также делиться на две части. !  Писать данные нужно в два прохода: –  сперва варьирущуюся часть, –  затем фиксированную. –  два прохода по объектам в памяти, –  на диск пишем подряд.
  • 17. 17 Как хранить ссылки !  Мы не знаем, с какого адреса будет начинаться отображенный файл; абсолютные адреса писать нельзя. !  «Наивный» подход: писать смещения от начала потока; –  нужно везде помнить это начало. !  Более правильный подход: писать смещения относительно ссылки.
  • 18. 18 Как хранить ссылки !  Данные не привязаны к своему положению в памяти; !  Для разыменования ссылки не нужно дополнительной информации. ‘J’   ‘o’   ‘h’   ‘0’  ‘n’   -­‐5   -­‐5  
  • 19. 19 Строка на горизонте !  Один reinterpret_cast – и у нас есть строка. –  с похожим на std::string интерфейсом! class ro_string { private: ssize_t m_ofs; size_t m_size; public: const char* data() const { return (const char*) &m_ofs + m_ofs; } size_t size() const { return m_size; } typedef const char* const_iterator; const_iterator begin() const { return data(); } const_iterator end() const { return data() + size(); } bool operator == (const string&) const { /*...*/ } bool operator < (const string&) const { /*...*/ } // more fancy methods };
  • 20. 20 Появляется двойственность !  Чтобы писать: struct wperson { std::string first_name; std::string last_name; unsigned age; }; !  Чтобы пользоваться: struct rperson { ro_string first_name; ro_string last_name; unsigned age; };
  • 21. 21 Нас спасут шаблоны! struct Standalone {}; struct Mapped {}; template<class Tag> class string; template<> class string<Standalone>: public std::string {}; template<> class string<Mmapped>: public ro_string {};
  • 22. 22 Нас спасут шаблоны! !  Создаём person<Standalone> и заполняем его; !  Сохраняем его в файл; !  Отображаем его в память (на другой машине); ! reinterpret_cast<person<Mmapped>>(pos); !  PROFIT! template<class Tag> struct person { string<Tag> first_name; string<Tag> last_name; unsigned age; };
  • 23. 23 Ключевые идеи, ещё раз !  Все данные органично делятся на две части: –  Фиксированную (поля структур и классов); –  Варьирующуюся (реальные данные, на которые ссылается фиксированная часть); !  Писать данные нужно в два прохода (сперва варьирующуся часть, потом фиксированную); !  Все смещения – относительные; !  Все данные – шаблоны, параметризуемые стратегией размещения.
  • 25. 25 Что можно сериализовать !  POD-ы; !  Структуры, все поля которых сериализуемы; !  Контейнеры, содержащие сериализуемые данные. template<class Tag> struct My { map<Tag, string<Tag>, vector<Tag, string<Tag>>> m; };
  • 26. 26 Пользовательские структуры !  Сперва пишем все варьирующиеся части всех полей; !  Потом пишем все фиксированные части всех полей. –  Не забываем о выравнивании. !  Нужна интроспекция полей структуры: template<class Tag> struct My { unsigned x; string<Tag> str; vector<Tag, string<Tag>> v; template<class A> void traverseFields(A a) { a(x)(str)(v); } };
  • 27. 27 Подводные грабли !  Можно перепутать порядок следования полей; –  следим, чтобы адреса полей монотонно возрастали; !  Можно забыть какое-то поле; –  увы, тут защититься нельзя. –  ждем интроспекции полей классов где-нибудь в районе С++22.
  • 28. 28 Контейнеры !  Все контейнеры непохожи друг на друга; !  Для каждого контейнера сериализацию приходится писать руками.
  • 30. 30 vector T   T   T   T   T’s  data...   vector<T>’s  data   offset   size   vector<T>  
  • 31. 31 vector !  Варьирующаяся часть: –  Сначала пишем варьирующуюся часть для всех элементов вектора; –  Затем пишем фиксированную часть для всех элементов вектора. !  Фиксированная часть: –  Просто пишем смещение до начала данных и размер.
  • 32. 32 deque, list, rope, slist... !  Отличаются от вектора различным поведением модифицирующих операций; ! readonly-интерфейс либо такой же, как у вектора, либо хуже; !  В примапленном файле всё равно ничего изменять нельзя. !  Не нужны.
  • 33. 33 map, set !  Если не рассматривать модифицирующие операции, остаётся поиск за O(log N). !  Сортированный вектор + бинарный поиск
  • 34. 34 unordered_map, unordered_set class unordered_set { vector<vector<T>> buckets; public: iterator find(const T& k) { for (T& t: buckets[hash(k) % buckets.size()] if (t == k) return &t; return end(); } }; T   T   T   T   buckets  
  • 35. 35 unordered_map, unordered_set class unordered_set { vector<T> items; vector<pair<T*, size_t>> buckets; public: iterator find(const T& k) { const auto& bkt = buckets[hash(k) % buckets.size()]; for (T *b = bkt.first, *e = b + bkt.second; b != e; ++b) if (*b == k) return &t; return end(); } }; T   T   T   T   buckets   items  
  • 36. 36 unordered_map, unordered_set class unordered_set { vector<T> items; vector<T*> buckets; public: iterator find(const T& k) { size_t bkt = hash(k) % (buckets.size() – 1); for (T *b = buckets[bkt], *e = buckets[bkt+1]; b != be; ++b) if (*b == k) return &t; return end(); } }; T   T   T   T   buckets   items  
  • 37. 37 unordered_map, unordered_set T   T   T   T   T’s  data...   offset   bucket  count   ofs   ofs   ofs   ofs   ofs   ofs   buckets   unordered_set<T>’s  data  unordered_set<T>  
  • 39. 39 Схема измерений !  Создаём матрицу 5000х1000 десятисимвольных строк; ! Сериализуем её в файл; ! Десериализуем обратно; !  Обходим в случайном порядке. !  Проверяем boost::archive::binary_archive и protobuf.
  • 40. 40 Схема измерений // protobuf.proto package perftest; message InnerMessage { repeated string item = 1; }; message OuterMessage { repeated InnerMessage row = 1; }; // boost.h struct Message { std::vector<std::vector<std::string>> v; template<class Archive> void serialize(Archive& a, unsigned) { a & v; } }; // mms.h template<class Tag> struct Message { mms::vector<Tag, mms::vector<Tag, mms::string<Tag>>> v; template<class Action> void traverseFields(Action a) { a(v); } };
  • 41. 41 Результаты измерений !  Как мы и хотели, чтения на приборах вообще не видно; !  Скорость доступа к элементам почти такая же, как и для STL-ных контейнеров; –  чуть-чуть меньше из-за относительных смещений. Boost   Protobuf   Mms   Запись,  мс   440   460   1200   Чтение,  мс   1200   1100   0   Обход,  мс   1300   2000   1400   Размер  файла,  Мб   85   56   156  
  • 42. 42 Результаты измерений !  Запись почти в три раза дольше; !  Полученный файл в 2..4 раза больше; –  но всё равно меньше, чем для STL (в отдельных случаях до 10 раз). Boost   Protobuf   Mms   Запись,  мс   440   460   1200   Чтение,  мс   1200   1100   0   Обход,  мс   1300   2000   1400   Размер  файла,  Мб   85   56   156  
  • 43. 43 Ложка дёгтя !  Нет инкрементальной записи; !  Привязка к платформе; !  Никакой расширяемости; –  миграция на новый формат данных – занятие нетривиальное.
  • 44. 44 Версии данных !  Можно посчитать некоторое число («версию данных»): –  для POD-ов – хэш от его typeid(T).name() и размера; –  для структур – полиномиальный хэш от версий всех полей; –  для контейнеров – хэш от типа контейнера и версии данных в нём. !  При сериализации сохраняем эту версию (один раз на файл); !  При десериализации проверяем версию, при несовпадении ругаемся.
  • 45. 45 Вместо заключения !  Описание сериализуемых данных на C++ (никакой кодогенерации); !  Привычный STL-like интерфейс; !  Моментальное чтение; !  Скорость доступа к элементам – (почти) как в STL. !  Хорошая локальность данных.
  • 46. 46 Кому может быть полезно? !  Если есть релизный цикл «создали – опубликовали – используем»; !  Если данных много и хочется сэкономить на декодировании; !  Если данные структурированы. !  Большой справочник адресов; !  Словарь для autocompletion-а; !  Дамп lurkmore; !  ...etc...