HighLoad++ 2017
Зал «Пекин + Шанхай», 8 ноября, 11:00
Тезисы:
http://www.highload.ru/2017/abstracts/2998.html
Ловко придумать схему сжатия для своих данных умеют не все, а очень зря. Иногда (иногда) при помощи этой магии удается добиться как бы невозможного: одновременно и сэкономить диск или память, и при этом ускорить код.
Как работает магия сжатия в целом? Как она работает более конкретно в очень разных продуктах: "просто базах" типа MySQL или Mongo; в поисковиках типа Lucene или Sphinx (или даже веб-поисках); в колоночных хранилищах типа Vertica или Clickhouse; в конце концов, внутри апдейтов Chrome?
...
Сжимать данные бывает зверски эффективно, но умеют далеко не все. Устроим поверхностный обзор современных алгоритмов сжатия, слегка обсудим методы изнутри MySQL, Mongo, Clickhouse и прочего. Устроим подробный разбор особо простых, однако всё равно эффективных методов, причем ловко применимых где угодно от plain C до JavaScript.
Как устроена MySQL-репликация / Андрей Аксенов (Sphinx)Ontico
Какая вообще в природе бывает репликация (sync vs. async vs. semisync, master-master vs. master-slave), как оно устроено конкретно в MySQL, в каких версиях что добавили. Про binary/relay log, про SBR/RBR/mixed форматы, про глупости с позициями и про GTID, про то, как из-за всяких бед возникают дополнительные продукты типа Tungsten и Galera. Несколько занятных фактов и парочка фокусов, которые можно учинять конкретно с MySQL-репликацией.
Доклад вчистую про внутреннее устройство, по результатам должно появляться общее понимание того, как оно работает внутри и почему именно так. Конкретные SQL-операторы подробно рассматривать НЕ будем, эти скучные мелочи необходимо будет затем самостоятельно смотреть в документации (или не смотреть).
Сравнение форматов и библиотек сериализации / Антон Рыжов (Qrator Labs)Ontico
В эпоху распределённых архитектур и микросервисов как никогда актуальными становятся вопросы — как эффективно сериализовать и передать данные. Большинство решает данный вопрос просто — используют стандартный, универсальный и всем понятный формат JSON. Другие же, ориентируясь на производительность, ищут в интернете бенчмарки и выбирают protobuf или msgpack.
Мы протестировали разные реализации статически (thrift, protocol buffers) и динамически (json, msgpack) типизированных протоколов для python; сравнили их производительность в разных сценариях, возможности, внутреннее устройство, удобство разработки.
Я расскажу о результатах нашего исследования, особенностях "приготовления" библиотек и выявленных подводных камнях.
Практика совместного использования Lua и C в opensource спам-фильтре Rspamd /...Ontico
В данном докладе я расскажу о том, как Lua помогает расширять функционал Rspamd, позволяя людям без особых знаний С писать эффективные правила фильтрации спама. Также будут рассмотрены особенности внедрения Lua в C код и основные приемы, применяемые при написании API для Lua приложений. Отдельное внимание будет уделено документации к Lua API, которая является одним из необходимых компонентов для opensource приложения.
Кроме этого, отдельная часть доклада посвящена анализу производительности Lua: использованию LuaJIT, сравнению вызовов C функций через FFI с традиционным вызовом, оптимизации строковых операций и таблиц в Lua.
В заключение будут рассмотрены некоторые открытые вопросы: будущее языка, наличие нескольких диалектов, статический анализ Lua стека, а также вопросы безопасности при JIT компиляции.
SQL-боттлнеки: поиск и устранение узких мест при масштабировании, Михаил Нови...Mail.ru Group
Вы начинаете новый проект. Устанавливаете веб-фреймворк, ORM-фреймворк, пишете модели, делаете запросы к БД. Всё идет хорошо. Потом к вам приходит 100 000 пользователей — и проект падает под нагрузкой. Ваши действия?
Такая ситуация была у нас полгода назад. Я расскажу, как мы нашли из нее выход, покажу наши подходы к поиску узких мест, сервисы, которые в этом помогают. И поясню, почему ванильный ORM — это зло.
Дмитрий Прокопцев "Memory-mapped storage: ещё один подход к сериализации данных"Yandex
В докладе пойдёт речь о методе сериализации произвольных данных, который применяется в Яндексе. Этот метод основан на отображаемых в память (mmapped) файлах и не требует операции декодирования. Мы рассмотрим его преимущества и недостатки, поговорим об общих принципах такой сериализации и об устройстве отображаемых аналогов стандартных контейнеров.
Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"Tanya Denisyuk
Тезисы:
За последние 2 года экосистема tarantool пополнилась огромным количеством батареек: дисковое хранение, lua-шардинг, работа со схемами данных и версиями, nginx upstream модуль. Используя эти компоненты, можно создавать высокопроизводительные приложения без использования дополнительных технологий.
В докладе будет описан опыт использования Tarantool для разработки performance-critical restful api: расскажу в чем плюсы и минусы текущей реализации lua-шардинга, как создать restful api прямо в базе данных и почему это быстрее многих популярных решений на примере реальных данных. Кроме того, будет рассмотрен подход использования avro схем для валидации, версионирования и хранения json документов в Tarantool. Для наглядности во время доклада будет разработан микросервис и проведено нагрузочное тестирование.
Andrew Aksyonoff "Архитектура вокруг поиска"Fwdays
Начиная с определенного масштаба, вокруг любого базового поискового движка плюс рядом с ним неизбежно вырастает изрядная куча всяких интересных прослоек и сервисов. Особенно, когда одним лишь поиском по ключевым словам (либо вообще булевым, либо с простеньким ранжированием по формуле) дело ограничиваться перестает. Расскажу, как сегодня выглядит архитектура сервисов “вокруг и около поиска” у нас в Авито (числа и слова для привлечения внимания: 40M+ активных объявлений, тысячи RPS, ML ранжирование, пляски с анализом и доставкой данных, и всё такое).
Сжимать данные бывает зверски эффективно, но умеют далеко не все. Устроим поверхностный обзор современных алгоритмов сжатия, слегка обсудим методы изнутри MySQL, Mongo, Clickhouse и прочего. Устроим подробный разбор особо простых, однако всё равно эффективных методов, причем ловко применимых где угодно от plain C до JavaScript.
Как устроена MySQL-репликация / Андрей Аксенов (Sphinx)Ontico
Какая вообще в природе бывает репликация (sync vs. async vs. semisync, master-master vs. master-slave), как оно устроено конкретно в MySQL, в каких версиях что добавили. Про binary/relay log, про SBR/RBR/mixed форматы, про глупости с позициями и про GTID, про то, как из-за всяких бед возникают дополнительные продукты типа Tungsten и Galera. Несколько занятных фактов и парочка фокусов, которые можно учинять конкретно с MySQL-репликацией.
Доклад вчистую про внутреннее устройство, по результатам должно появляться общее понимание того, как оно работает внутри и почему именно так. Конкретные SQL-операторы подробно рассматривать НЕ будем, эти скучные мелочи необходимо будет затем самостоятельно смотреть в документации (или не смотреть).
Сравнение форматов и библиотек сериализации / Антон Рыжов (Qrator Labs)Ontico
В эпоху распределённых архитектур и микросервисов как никогда актуальными становятся вопросы — как эффективно сериализовать и передать данные. Большинство решает данный вопрос просто — используют стандартный, универсальный и всем понятный формат JSON. Другие же, ориентируясь на производительность, ищут в интернете бенчмарки и выбирают protobuf или msgpack.
Мы протестировали разные реализации статически (thrift, protocol buffers) и динамически (json, msgpack) типизированных протоколов для python; сравнили их производительность в разных сценариях, возможности, внутреннее устройство, удобство разработки.
Я расскажу о результатах нашего исследования, особенностях "приготовления" библиотек и выявленных подводных камнях.
Практика совместного использования Lua и C в opensource спам-фильтре Rspamd /...Ontico
В данном докладе я расскажу о том, как Lua помогает расширять функционал Rspamd, позволяя людям без особых знаний С писать эффективные правила фильтрации спама. Также будут рассмотрены особенности внедрения Lua в C код и основные приемы, применяемые при написании API для Lua приложений. Отдельное внимание будет уделено документации к Lua API, которая является одним из необходимых компонентов для opensource приложения.
Кроме этого, отдельная часть доклада посвящена анализу производительности Lua: использованию LuaJIT, сравнению вызовов C функций через FFI с традиционным вызовом, оптимизации строковых операций и таблиц в Lua.
В заключение будут рассмотрены некоторые открытые вопросы: будущее языка, наличие нескольких диалектов, статический анализ Lua стека, а также вопросы безопасности при JIT компиляции.
SQL-боттлнеки: поиск и устранение узких мест при масштабировании, Михаил Нови...Mail.ru Group
Вы начинаете новый проект. Устанавливаете веб-фреймворк, ORM-фреймворк, пишете модели, делаете запросы к БД. Всё идет хорошо. Потом к вам приходит 100 000 пользователей — и проект падает под нагрузкой. Ваши действия?
Такая ситуация была у нас полгода назад. Я расскажу, как мы нашли из нее выход, покажу наши подходы к поиску узких мест, сервисы, которые в этом помогают. И поясню, почему ванильный ORM — это зло.
Дмитрий Прокопцев "Memory-mapped storage: ещё один подход к сериализации данных"Yandex
В докладе пойдёт речь о методе сериализации произвольных данных, который применяется в Яндексе. Этот метод основан на отображаемых в память (mmapped) файлах и не требует операции декодирования. Мы рассмотрим его преимущества и недостатки, поговорим об общих принципах такой сериализации и об устройстве отображаемых аналогов стандартных контейнеров.
Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"Tanya Denisyuk
Тезисы:
За последние 2 года экосистема tarantool пополнилась огромным количеством батареек: дисковое хранение, lua-шардинг, работа со схемами данных и версиями, nginx upstream модуль. Используя эти компоненты, можно создавать высокопроизводительные приложения без использования дополнительных технологий.
В докладе будет описан опыт использования Tarantool для разработки performance-critical restful api: расскажу в чем плюсы и минусы текущей реализации lua-шардинга, как создать restful api прямо в базе данных и почему это быстрее многих популярных решений на примере реальных данных. Кроме того, будет рассмотрен подход использования avro схем для валидации, версионирования и хранения json документов в Tarantool. Для наглядности во время доклада будет разработан микросервис и проведено нагрузочное тестирование.
Andrew Aksyonoff "Архитектура вокруг поиска"Fwdays
Начиная с определенного масштаба, вокруг любого базового поискового движка плюс рядом с ним неизбежно вырастает изрядная куча всяких интересных прослоек и сервисов. Особенно, когда одним лишь поиском по ключевым словам (либо вообще булевым, либо с простеньким ранжированием по формуле) дело ограничиваться перестает. Расскажу, как сегодня выглядит архитектура сервисов “вокруг и около поиска” у нас в Авито (числа и слова для привлечения внимания: 40M+ активных объявлений, тысячи RPS, ML ранжирование, пляски с анализом и доставкой данных, и всё такое).
Sphinx 3.0, поиск 15 лет спустя / Андрей Аксенов (Sphinx)Ontico
За 15 лет разработки концепция немного поменялась и, начиная со Sphinx 3.0, мы теперь, если задуматься, вполне себе самостоятельная распределенная база (с фокусом на полнотекстовый поиск), а не только лишь добавочный к основному хранилищу поисковый движок.
Порядка 2 лет уже пилим ряд больших внутренних переделок под флагом 3.0 и, вот, наконец-то, доделываем. (На момент подачи тезисов "наполовину" готов новый клевый формат индекса; к моменту проведения конференции рассчитываем выложить публично доступную альфу).
Уже приделано всякое интересное:
* новый формат индекса, компактный и быстрый (в разы быстрее индексация и поиск);
* дисковое хранилище для документов и всяких спец. данных;
* полноценные B-tree индексы по атрибутам;
* репликация индексов.
Сделаю краткий обзор внутренней реализации этого всего, расскажу, как мы переложили битики и байтики, и что и почему это дало функционально.
Бенчмарков "а почему не Elastic" сделать не успеем, для этого нужны добровольцы. Добровольцы, подайте 1 громкий зеленый email вверх.
Почему оно не находится! / Андрей Аксенов (Sphinx)Ontico
HighLoad++ 2017
Зал «Конгресс-Холл», 7 ноября, 18:00
Тезисы:
http://www.highload.ru/2017/abstracts/3000.html
...и что сделать, чтобы уже находилось?
И снова про качество поиска. Поменьше скучной теории (ну, чтобы не более 60%); больше практических примеров. Как оценить типа-качество "на пальцах"; почему это плохая идея. Как построить оценивалку; насколько это просто; где взять готовую (нигде); зачем человечеству Толока или Mechanical Turk.
...
Обзорный доклад про базовое внутреннее устройство любого современного поискового движка. Про сжатые списки документов и позиций, как затем с ними работает поиск совпадающих документов (и разные операторы), как устроено ранжирование найденных документов, как бывают устроены и работают с фильтрацией и агрегацией дополнительные (нетекстовые) атрибуты документов. По возможности, упоминание всех известных вариантов реализаций (как, вообще, можно, как сделано в Sphinx, как в Lucene).
1. Двоичная система счисления, перевод чисел, битовое представление.
2. Шестнадцатеричная система счисления.
3. Хранение знака: знак в старшем бите (наивный способ).
4. Арифметика по модулю и двоичный дополнительный код.
5. Переполнение.
6. Двоично-десятичный код, Packed BCD.
7. Символы и кодировки: от ASCII к Unicode.
8. Строки, базовые способы их представления.
9. Операции со строками.
10. «Веревки» — альтернативный способ представления строк.
11. Сериализация и десериализация. Пример: сериализация массива чисел переменной длины.
12. Двойственность порядка байт: little-endian и big-endian.
Презентация с конференции "Город IT"
Томск, 19 ноября 2016 года.
Андрей Аксёнов, ведущий разработчик Unigine.
Доклад: «С одним плюсом».
— К чему надо стремиться, разрабатывая на C++ (и не только)?
— Как писать элегантно на C++’03 и что делать с новыми стандартами?
— Как на C++ делать не надо?
— Об идеальном коде и Идеальной Архитектуре.
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...Ontico
HighLoad++ 2017
Зал «Калининград», 8 ноября, 15:00
Тезисы:
http://www.highload.ru/2017/abstracts/2964.html
Одноклассники состоят из более чем восьми тысяч железных серверов, расположенных в нескольких дата-центрах. Каждая из этих машин была специализированной под конкретную задачу - как для обеспечения изоляции отказов, так и для обеспечения автоматизированного управления инфраструктурой.
...
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Ontico
HighLoad++ 2017
Зал «Калининград», 8 ноября, 16:00
Тезисы:
http://www.highload.ru/2017/abstracts/3032.html
Протокол DNS на семь лет старше, чем Всемирная паутина. Стандарты RFC 882 и 883, определяющие основную функциональность системы доменных имён, появились в конце 1983 года, а первая реализация последовала уже годом позже. Естественно, что у технологии столь старой и при этом по сей день активнейшим образом используемой просто не могли не накопиться особенности, неочевидные обыкновенным пользователям.
...
More Related Content
Similar to Хочу все сжать / Андрей Аксенов (Sphinx)
Sphinx 3.0, поиск 15 лет спустя / Андрей Аксенов (Sphinx)Ontico
За 15 лет разработки концепция немного поменялась и, начиная со Sphinx 3.0, мы теперь, если задуматься, вполне себе самостоятельная распределенная база (с фокусом на полнотекстовый поиск), а не только лишь добавочный к основному хранилищу поисковый движок.
Порядка 2 лет уже пилим ряд больших внутренних переделок под флагом 3.0 и, вот, наконец-то, доделываем. (На момент подачи тезисов "наполовину" готов новый клевый формат индекса; к моменту проведения конференции рассчитываем выложить публично доступную альфу).
Уже приделано всякое интересное:
* новый формат индекса, компактный и быстрый (в разы быстрее индексация и поиск);
* дисковое хранилище для документов и всяких спец. данных;
* полноценные B-tree индексы по атрибутам;
* репликация индексов.
Сделаю краткий обзор внутренней реализации этого всего, расскажу, как мы переложили битики и байтики, и что и почему это дало функционально.
Бенчмарков "а почему не Elastic" сделать не успеем, для этого нужны добровольцы. Добровольцы, подайте 1 громкий зеленый email вверх.
Почему оно не находится! / Андрей Аксенов (Sphinx)Ontico
HighLoad++ 2017
Зал «Конгресс-Холл», 7 ноября, 18:00
Тезисы:
http://www.highload.ru/2017/abstracts/3000.html
...и что сделать, чтобы уже находилось?
И снова про качество поиска. Поменьше скучной теории (ну, чтобы не более 60%); больше практических примеров. Как оценить типа-качество "на пальцах"; почему это плохая идея. Как построить оценивалку; насколько это просто; где взять готовую (нигде); зачем человечеству Толока или Mechanical Turk.
...
Обзорный доклад про базовое внутреннее устройство любого современного поискового движка. Про сжатые списки документов и позиций, как затем с ними работает поиск совпадающих документов (и разные операторы), как устроено ранжирование найденных документов, как бывают устроены и работают с фильтрацией и агрегацией дополнительные (нетекстовые) атрибуты документов. По возможности, упоминание всех известных вариантов реализаций (как, вообще, можно, как сделано в Sphinx, как в Lucene).
1. Двоичная система счисления, перевод чисел, битовое представление.
2. Шестнадцатеричная система счисления.
3. Хранение знака: знак в старшем бите (наивный способ).
4. Арифметика по модулю и двоичный дополнительный код.
5. Переполнение.
6. Двоично-десятичный код, Packed BCD.
7. Символы и кодировки: от ASCII к Unicode.
8. Строки, базовые способы их представления.
9. Операции со строками.
10. «Веревки» — альтернативный способ представления строк.
11. Сериализация и десериализация. Пример: сериализация массива чисел переменной длины.
12. Двойственность порядка байт: little-endian и big-endian.
Презентация с конференции "Город IT"
Томск, 19 ноября 2016 года.
Андрей Аксёнов, ведущий разработчик Unigine.
Доклад: «С одним плюсом».
— К чему надо стремиться, разрабатывая на C++ (и не только)?
— Как писать элегантно на C++’03 и что делать с новыми стандартами?
— Как на C++ делать не надо?
— Об идеальном коде и Идеальной Архитектуре.
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...Ontico
HighLoad++ 2017
Зал «Калининград», 8 ноября, 15:00
Тезисы:
http://www.highload.ru/2017/abstracts/2964.html
Одноклассники состоят из более чем восьми тысяч железных серверов, расположенных в нескольких дата-центрах. Каждая из этих машин была специализированной под конкретную задачу - как для обеспечения изоляции отказов, так и для обеспечения автоматизированного управления инфраструктурой.
...
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Ontico
HighLoad++ 2017
Зал «Калининград», 8 ноября, 16:00
Тезисы:
http://www.highload.ru/2017/abstracts/3032.html
Протокол DNS на семь лет старше, чем Всемирная паутина. Стандарты RFC 882 и 883, определяющие основную функциональность системы доменных имён, появились в конце 1983 года, а первая реализация последовала уже годом позже. Естественно, что у технологии столь старой и при этом по сей день активнейшим образом используемой просто не могли не накопиться особенности, неочевидные обыкновенным пользователям.
...
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Ontico
HighLoad++ 2017
Зал «Калининград», 8 ноября, 13:00
Тезисы:
http://www.highload.ru/2017/abstracts/3010.html
В этом докладе я расскажу, как BigData-платформа помогает трансформировать Почту России, как мы управляем построением и развитием платформы. Расскажу про найденные удачные решения, например, как разбиение на продукты с понятными SLA и интерфейсами между ними помогло нам сохранять управляемость с ростом масштабов проекта.
...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Ontico
HighLoad++ 2017
Зал «Кейптаун», 8 ноября, 10:00
Тезисы:
http://www.highload.ru/2017/abstracts/2914.html
Казалось бы, что нужно для организации тестового окружения? Тестовая железка и копия боевого окружения - и тестовый сервер готов. Но как быть, когда проект сложный? А когда большой? А если нужно тестировать одновременно много версий? А если все это вместе?
Организация тестирования большого развивающегося проекта, где одновременно в разработке и тестировании около полусотни фич - достаточно непростая задача. Ситуация обычно осложняется тем, что иногда есть желание потрогать еще не полностью готовый функционал. В таких ситуациях часто возникает вопрос: "А куда это можно накатить и где покликать?"
...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Ontico
HighLoad++ 2017
Зал «Кейптаун», 8 ноября, 18:00
Тезисы:
http://www.highload.ru/2017/abstracts/2854.html
Из этого доклада вы узнаете о возможностях репликации и автофейловера PostgreSQL, в том числе о возможностях, ставших доступных в PostgreSQL 10.
Среди прочих, будет затронуты следующие темы:
* Виды репликации и решаемые с ее помощью проблемы.
* Настройка потоковой репликации.
* Настройка логической репликации.
* Настройка автофейловера / HA средствами Stolon и Consul.
После прослушивания доклада вы сможете самостоятельно настраивать репликацию и автофейловер PostgreSQL.
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)Ontico
HighLoad++ 2017
Зал «Кейптаун», 8 ноября, 17:00
Тезисы:
http://www.highload.ru/2017/abstracts/3096.html
PostgreSQL is the world’s most advanced open source database. Indeed! With around 270 configuration parameters in postgresql.conf, plus all the knobs in pg_hba.conf, it is definitely ADVANCED!
How many parameters do you tune? 1? 8? 32? Anyone ever tuned more than 64?
No tuning means below par performance. But how to start? Which parameters to tune? What are the appropriate values? Is there a tool --not just an editor like vim or emacs-- to help users manage the 700-line postgresql.conf file?
Join this talk to understand the performance advantages of appropriately tuning your postgresql.conf file, showcase a new free tool to make PostgreSQL configuration possible for HUMANS, and learn the best practices for tuning several relevant postgresql.conf parameters.
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Ontico
HighLoad++ 2017
Зал «Кейптаун», 8 ноября, 16:00
Тезисы:
http://www.highload.ru/2017/abstracts/3115.html
During this session we will cover the last development in ProxySQL to support regular expressions (RE2 and PCRE) and how we can use this strong technique in correlation with ProxySQL's query rules to anonymize live data quickly and transparently. We will explain the mechanism and how to generate these rules quickly. We show live demo with all challenges we got from the Community and we finish the session by an interactive brainstorm testing queries from the audience.
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Ontico
HighLoad++ 2017
Зал «Кейптаун», 8 ноября, 15:00
Тезисы:
http://www.highload.ru/2017/abstracts/2957.html
Расскажем о нашем опыте разработки модуля межсетевого экрана для MySQL с использованием генератора парсеров ANTLR и языка Kotlin.
Подробно рассмотрим следующие вопросы:
— когда и почему целесообразно использовать ANTLR;
— особенности разработки ANTLR-грамматики для MySQL;
— сравнение производительности рантаймов для ANTLR в рамках задачи синтаксического анализа MySQL (C#, Java, Kotlin, Go, Python, PyPy, C++);
— вспомогательные DSL;
— микросервисная архитектура модуля экранирования SQL;
— полученные результаты.
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)Ontico
HighLoad++ 2017
Зал «Кейптаун», 8 ноября, 14:00
Тезисы:
http://www.highload.ru/2017/abstracts/3114.html
ProxySQL aims to be the most powerful proxy in the MySQL ecosystem. It is protocol-aware and able to provide high availability (HA) and high performance with no changes in the application, using several built-in features and integration with clustering software. During this session we will quickly introduce its main features, so to better understand how it works. We will then describe multiple use case scenarios in which ProxySQL empowers large MySQL installations to provide HA with zero downtime, read/write split, query rewrite, sharding, query caching, and multiplexing using SSL across data centers.
MySQL Replication — Advanced Features / Петр Зайцев (Percona)Ontico
HighLoad++ 2017
Зал «Кейптаун», 8 ноября, 13:00
Тезисы:
http://www.highload.ru/2017/abstracts/2954.html
MySQL Replication is powerful and has added a lot of advanced features through the years. In this presentation we will look into replication technology in MySQL 5.7 and variants focusing on advanced features, what do they mean, when to use them and when not, Including.
When should you use STATEMENT, ROW or MIXED binary log format?
What is GTID in MySQL and MariaDB and why do you want to use them?
What is semi-sync replication and how is it different from lossless semi-sync?
...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Ontico
HighLoad++ 2017
Зал «Кейптаун», 8 ноября, 12:00
Тезисы:
http://www.highload.ru/2017/abstracts/3120.html
Количество разработчиков мобильных приложений Сбербанк Онлайн с начала 2016 года выросло на порядок. Для того чтобы продолжать выпускать качественный продукт, мы кардинально перестраиваем процесс разработки.
Количество внутренних заказчиков тех или иных доработок в какой-то момент выросло настолько, что разработчики стали узким местом. Мы внедрили культуру разработки, которую можно условно назвать "внутренним open-source", сохранив за собой контроль над архитектурой и качеством проекта, но позволив разрабатывать новые фичи всем желающим.
...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Ontico
HighLoad++ 2017
Зал «Мумбай», 8 ноября, 18:00
Тезисы:
http://www.highload.ru/2017/abstracts/2836.html
При использовании Eventually Consistent распределенных баз данных нет гарантий, что чтение возвращает результаты последних изменений данных, если чтение и запись производятся на разных узлах. Это ограничивает пропускную способность системы. Поддержка свойства Causal Consistency снимает это ограничение, что позволяет улучшить масштабируемость, не требуя изменений в коде приложения.
...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Ontico
HighLoad++ 2017
Зал «Мумбай», 8 ноября, 16:00
Тезисы:
http://www.highload.ru/2017/abstracts/2858.html
Аудитория Одноклассников превышает 73 миллиона человек в России, СНГ и странах дальнего зарубежья. При этом ОК.ru - первая социальная сеть по просмотрам видео в рунете и крупнейшая сервисная платформа.
Качественный и количественный рост DDoS-атак за последние годы превращает их в одну из первоочередных проблем для крупнейших интернет-ресурсов. В зависимости от вектора атаки “узким” местом становится та или иная часть инфраструктуры. В частности, при SYN-flood первый удар приходится на систему балансировки трафика. От ее производительности зависит успех в противостоянии атаке.
...
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Ontico
HighLoad++ 2017
Зал «Мумбай», 8 ноября, 15:00
Тезисы:
http://www.highload.ru/2017/abstracts/3008.html
Никогда не было и вот снова случилось! Компания Google в результате перенаправления трафика сделала недостпуными в Японии несколько тысяч различных сервисов, большинство из которых никак не связано с самой компанией Google. Однако, подобные инциденты происходят с завидной регулярностью, вот только не всегда попадают в большие СМИ. У таких инцидентов могут быть разные причины, начиная от ошибок сетевых инженеров и заканчивая государственным регулированием.
...
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)Ontico
HighLoad++ 2017
Зал «Мумбай», 8 ноября, 14:00
Тезисы:
http://www.highload.ru/2017/abstracts/2925.html
Облака и виртуализация – современные тренды развития IT-технологий. Операторы связи строят свои TelcoClouds на стандартах NFV (Network Functions Virtualization) и SDN (Software-Defined Networking). В докладе начнем с основ виртуализации, далее разберемся, для чего используются NFV и SDN, потом полетим к облакам и вернемся на землю для решения практических задач!
...
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Ontico
HighLoad++ 2017
Зал «Мумбай», 8 ноября, 10:00
Тезисы:
http://www.highload.ru/2017/abstracts/3045.html
Как мы заставили Druid работать в Одноклассниках.
«Druid is a high-performance, column-oriented, distributed data store» http://druid.io.
Мы расскажем о том, как, внедрив Druid, мы справились с ситуацией, когда MSSQL-based система статистики на 50 терабайт стала:
- медленной: средняя скорость ответа была в разы меньше требуемой (и увеличилась в 20 раз);
- нестабильной: в час пик статистика отставала до получаса (теперь ничего не отстает);
- дорогой: изменилась политика лицензирования Microsoft, расходы на лицензии могли составить миллионы долларов.
...
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Ontico
HighLoad++ 2017
Зал «Рио-де-Жанейро», 8 ноября, 18:00
Тезисы:
http://www.highload.ru/2017/abstracts/2905.html
Прошло более года с того момента, как Microsoft выпустила первую версию своего нового фреймворка для разработки web-приложений ASP.NET Core, и с каждым днем он находит все больше поклонников. ASP.NET Core базируется на платформе .NET Core, кроссплатформенной версии платформы .NET c открытым исходным кодом. Теперь у С#-разработчиков появилась возможность использовать Mac в качестве среды разработки, и запускать приложения на Linux или внутри Docker-контейнеров.
...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...Ontico
HighLoad++ 2017
Зал «Рио-де-Жанейро», 8 ноября, 14:00
Тезисы:
http://www.highload.ru/2017/abstracts/2913.html
Изначально будут раскрыты базовые причины, которые заставили появиться такой части механизма СУБД, как кэш результатов, и почему в ряде СУБД он есть или отсутствует.
Будут рассмотрены различные варианты кэширования результатов как sql-запросов, так и результатов хранимой в БД бизнес-логики. Произведено сравнение способов кэширования (программируемые вручную кэши, стандартный функционал) и даны рекомендации, когда и в каких случаях данные способы оптимальны, а порой опасны.
...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Ontico
HighLoad++ 2017
Зал «Рио-де-Жанейро», 8 ноября, 13:00
Тезисы:
http://www.highload.ru/2017/abstracts/2947.html
Apache Ignite — Open Source платформа для высокопроизводительной распределенной работы с большими данными с применением SQL или Java/.NET/C++ API. Ignite используют в самых разных отраслях. Сбербанк, ING, RingCentral, Microsoft, e-Therapeutics — все эти компании применяют решения на основе Ignite. Размеры кластеров разнятся от всего одного узла до нескольких сотен, узлы могут быть расположены в одном ЦОД-е или в нескольких геораспределенных.
...
HighLoad++ 2017
Зал «Рио-де-Жанейро», 8 ноября, 12:00
Тезисы:
http://www.highload.ru/2017/abstracts/3005.html
Когда мы говорим о нагруженных системах и базах данных с большим числом параллельных коннектов, особый интерес представляет практика эксплуатации и сопровождения таких проектов. В том числе инструменты и механизмы СУБД, которые могут быть использованы DBA и DevOps-инженерами для решения задач мониторинга жизнедеятельности базы данных и ранней диагностики возможных проблем.
...
2. disclaimer // 18+ // [R] // уберите детей
• Да, как обычно обзорный доклад, без хардкора
• Упомяну 10-20 методов вскользь, дальше в википедию
• Чуть в детали в 5-7 простых методов, дальше в википедию
• Ну или в коридор (лучше), время до обеда есть, гуляем
• Да, репетировал; нет, в бюджет времени не уложусь
• Speaker rant, доклады не в том порядке!!!
3. Про сжатие
• Несколько шире архиваторов и даже zlib
• 7zip, rar, tar.bz2 – сжатие
• jpeg, mp3, aac, h264, bpg – сжатие
• gzip, lz4, snappy, brotli, zstd – сжатие
• huffman, ari/range, varint – сжатие
• byte x = byte(float(y)*127) – тоже сжатие!!!
• Бывает таки не только в мире C/C++
• Java, Go, C#, Rust? Python, JavaScript, PHP?
• Причём тут вообще “highload”?...
4. Сжатие == две ключевых части
• Как мне идеально сжать что_угодно?
1. Хитро преобразовать (или нет)
2. Ловко закодировать (или нет)
• Зачем преобразовывать?
• Чтобы ловчее кодировалось!
• Кодировать это уже небось адски сложно?
• Шокирующие новости – НЕТ!
• И, собственно, код – фундамент успеха
• В отличие от IT и даже программирования, kekeke
5. Любой код за 1 минуту
• Buy low, sell high?
• Круглое носить, квадратное катать?
• Частое паковать, редкое раздувать
• Причем, речь всегда о числах (и битах/байтах)
• Классика: Huffman, Golomb, Rice, Elias, ari/range
• Поновей: varint, S9/S16, PFOR
• Важно: свой личный DIY нередко зажжот
6. Что значит “частое”?
• Например, английские тексты, pg.txt
• Буквы a-z ожидаемо чаще всех других
• 336.2m всего
• 242.0m [a-z]
• 31.0m [e]
• 21.9m [t]
• 19.4m [a]
• …
• 8.1m [A-Z]
7. Что значит “частое”?
• Например, английские тексты, pg.txt
• Байты a-z тоже сильно чаще всех других
• 336.2m всего
• 242.0m [a-z]
• 54.1m [ ] самый частый байт (да, пробел)
• 31.0m [e]
• …
8. Наш первый (тупой) код
• Пробел = 1 бит, “0”, и так 54.1m раз
• Остальное = 9 бит, “1 vvvvvvvv”, 282.1m раз
• -378.7 mbit = -7 bit * 54.1m
• +282.1 mbit = +1 bit * 282.1m
• -12.0 mbyte = -96.6 = -378.7+282.1 mbit
• Наш первый профит – ура!!!
• Уже плюс сжатие, но всего на 3.6% :(
• Минус случайный доступ, “плюс” бииииты
9. Почему так плохо?!
• Мало сэкономили, достаточно проиграли
• Надо экономить на N частых байтах, а не 1
• Давайте занумеруем байты по частоте
• 1 = ‘ ‘
• 2 = ‘e’
• 3 = ‘t’
• 4 = ‘a’
• …
• Надо передать таблицу = 256 байт, фигня
10. Наш второй код
• Давайте номер #1 кодировать в 1 бит “1”
• Давайте остальные номера кодировать
• Минимальным нужным числом бит B
• Которое кодировать цепочкой (B-1) нулей
• #1 = “1” 1 бит ‘ ‘
• #2 = “0 10” 3 бита ‘e’
• #3 = “0 11” 3 бита ‘t’
• #4 = “00 100” 5 бит ‘a’
11. Не совсем наш код
• Результаты кодирования?
• #1, 8 => 1 бит
• #2-3, 8 => 3 бита
• #4-7, 8 => 5 бит
• #8-15, 8 => 7 бит
• #16-256, 8 => 9, 11, …, 17 бит
• Тем не менее, 336.2mb => 231.0mb, 68.7%
• Это, кстати, Elias gamma code [Elias1975]
• Но, конечно, бииииты
12. Наш третий код
• Давайте #1-8 кодировать в 4 бита, “1 vvv”
• Давайте #9-135 в 8 бит, “0 ddd dddd”, d = v-9
• Давайте #136-256 в 16 бит, “0 111 1111” V
• ref 336.2mb 100.0%
• v2-gamma 231.0mb 68.7%
• v3-nibble 232.0mb 69.0%
• Чёрт, чуток проиграли дедушке Elias
• Но, зато больше нету битов! (побитного чтения)
13. Наш третий код
• Кстати, а если #136-256 ваще в 256 бит?!
• v3-nibble 232.0mb, 69.0%
• v3-nibble-megaloss 232.4mb, 69.1%
14. Наш третий код
• Кстати, а если #136-256 ваще в 256 бит?!
• v3-nibble 232.0mb, 69.0%
• v3-nibble-megaloss 232.4mb, 69.1%
15. Наш третий код – важное замечание
• Кстати, а если #136-256 ваще в 256 бит?!
• v3-nibble 232.0mb, 69.0%
• v3-nibble-megaloss 232.4mb, 69.1%
• Так будет НЕ ВСЕГДА
• Но здесь – вот такая статистика
• И – не только здесь
16. Почему побитно – отстой?
int get_byte() {
return m_buf[m_pos++];
}
18. Почему побитно – отстой?
int get_bits(int n) {
static const byte mask[8] = {1,3,7,15,31,63,127,255};
int r = 0, s = 0, pmax = m_pos + n;
while (m_pos < pmax) {
int b = (m_pos & 7);
int got = min(pmax – m_pos, 8 – pbit);
r += ((m_buf[m_pos >> 3] >> b) & mask[got]) << s;
m_pos += got;
s += got;
}
return r;
} // probably buggy like hell too
19. Почему побитно – отстой?
int get_bits(int n) {
int64_t v = *(int64_t*)(m_buf + (m_pos >> 3));
v >>= (m_pos & 7);
m_pos += n;
return int(v & ((1ULL << n) – 1));
}
// needs a post-buffer gap, of course
20. Почему побитно – отстой?
int get_bits(int n) {
int64_t v = *(int64_t*)(m_buf + (m_pos >> 3));
v >>= (m_pos & 7);
m_pos += n;
return int(v & ((1ULL << n) – 1));
}
// ...vs...
int get_byte() {
return *m_ptr++;
}
21. А можно ли тогда – байтами?!
• Можно!!!
• Тут – не выйдет, т.к. байты и кодируем
• Лежит хомяк, на нём хомяк…
• Там – выйдет, где числа побольше
• Например, произвольные int, до 32 бит
• Например, длины строк
• Например, строки-то часто, кхм, недлинные
22. Наш четвертый код
• Кодируем произвольную длину, 4 байта
• Кодируем по 1 байту за раз, “M VVV VVVV”
• Верхний 1 бит, m == 0 конец, 1 не конец
• Остальные 7 бит, vvvvvvv == кусок значения
• Длины 0-127 == 1 байт
• Длины 128-16383 == 2 байта, и т.д.
• Длины 268 435 456+ == 5 байт, конечно
• Это, кстати, VarInt (всенародно любимый)
23. За что его любить!?
int decode_varint() {
int r = *m_ptr & 127;
while (*m_ptr++ & 128)
r = (r << 7) + (*m_ptr & 127);
return r;
}
// btw, 500+ mb/sec, 5+ yr/ago; also, JS
24. Наш пятый код
• Кодируем любой честный int (напр. длина)
• Значения 0-251 кладем как есть == 1 байт
• Иначе 252-255 == “ща поедет 1-4 байта”
• 173 => {173}
• 253 => {252, 253}
• 0xABCD => {253, 0xCD, 0xAB} // native order
• Длины 252+ == 2-5 байт, всегда +1 лишний
• Это, кстати, MySQL (wire protocol, at least)
25. Давай уж опять свой декодер
int decode_mysql() {
int *p = (int*)++m_ptr;
switch (m_ptr[-1]) {
case 252: return *p & 0xff;
case 253: return *p & 0xffff;
case 254: return *p & 0xffffff;
case 255: return *p;
default: return m_ptr[-1];
} // did not bench, but fast
26. Мне скучно и я пожалуй пойду
• Стоять, мы уже вообще научились кодировать
• Ну, почти
• Конечно, есть еще 10+ методов, и 2-3+ крутых (GVI, S9, PFOR…)
• Но для начала хватит и этих, и они вас не подведут
• Но таки давайте чуть про “преобразовывать”
• Обзорно, без исходников уже
• Ну, почти
27. Дискотека 1970х
• А вот у меня pg.txt, там текст
• [Gutenberg] в позициях 11, 307 итд в pg.txt
• Давайте в позиции 11 сохраним сами байты
• cmd = 0 (literal), len = 9, data = [Gutenberg] => +1 byte
28. Дискотека 1970х
• А вот у меня pg.txt, там текст
• [Gutenberg] в позициях 11, 307 итд в pg.txt
• Давайте в позиции 11 сохраним сами байты
• cmd = 0 (literal), len = 9, data = [Gutenberg] => +1 byte
• Давайте в позиции 307 сохраним ссылку
• cmd = 1 (match), len = 9, data = 296 => -6 bytes
29. Дискотека 1970х
• А вот у меня pg.txt, там текст
• [Gutenberg] в позициях 11, 307 итд в pg.txt
• Давайте в позиции 11 сохраним сами байты
• cmd = 0 (literal), len = 9, data = [Gutenberg] => +1 byte
• Давайте в позиции 307 сохраним ссылку
• cmd = 1 (match), len = 9, data = 296 => -6 bytes
• Все циферки как-то кодируем, мы ж умеем
• Например ((len << 1) + command) вместе! чтобы +1, а не +2 там вверху
• Ура, мы изобрели семейство LZ (Lempel-Ziv)
30. Дискотека 1980х
• А вот у меня pg.txt, там текст
• Увидели в потоке байт X, а далее увидели Y
• Вероятность увидеть именно Y зависит от X
• “ВЕ” чаще, “ВЬ” реже, “ЕЬ” вообще нету в языке
• Давайте сделаем 256 таблиц по 256 счетчиков
31. Почему так плохо?!
• Мало сэкономили, достаточно проиграли
• Надо экономить на N частых байтах, а не 1
• Давайте занумеруем байты по частоте
• 1 = ‘ ‘
• 2 = ‘e’
• 3 = ‘t’
• 4 = ‘a’
• …
• Надо передать таблицу = 256 байт, фигня
32. Дискотека 1980х
• А вот у меня pg.txt, там текст
• Увидели в потоке байт X, а далее увидели Y
• Вероятность увидеть именно Y зависит от X
• “ВЕ” чаще, “ВЬ” реже, “ЕЬ” вообще нету в языке
• Давайте сделаем 256 таблиц по 256 счетчиков
• Давайте обновлять их на лету (чтобы 1 проход)
• Давайте вместо Y кодировать номер Y в table[X]
• Ура, мы изобрели простейший PPM(1)
• А если контекст X это N байт, то PPM(N)
33. Дискотека 1990х, 2000х
• Продвижения кое-какие были, да
• Внимание не заостряем, нет – времени нет :P
• Считаем, что в святые 90е реализовали и отполировали
34. Дискотека 2010х
• А вот у меня pg.txt, там текст
• Давайте заведем словарь!!!
• Увидели слово [project], закодировали номер в словаре
• Увидели незнакомое, закодировали “как в LZ”
• Ну нет, не совсем как LZ, ладно, вру
• Ещё “модель контекста” какая-то, непонятно, в вики глянем
• Ура, мы изобрели Brotli
• А пока мы его изобретали, уже полвеба умеет (якобы)
35. Как же “преобразовывать”?
• Внезапно, теперь мы можем всё!!!
• Gzip = LZ77 + Huffman
• 7zip = LZMA / PPM + range coder (грубо говоря)
• Lz4 = LZ77 + DIY_code
• byte marker = (literal_len << 4) + match_len
• byte literal [ literal_len ]
• short offset // от текущей позиции назад
• Zstd = LZ77 + tANS entropy coder
• Brotli = LZ77 + Huffman + context modeling + dict
• …
36. А если там не текст?
• А у меня поиск, а там (удивление!) не текст!
• А там слово “hello” => список номеров
• {12, 31, 79, 139, 517, …, 1234567, 1234568, 1234569, …}
• Номера всегда растут
• Тупо жать каждый номер? Нет!
• Тупо жать дельты между номерами? Да!!!
• {12, 19, 48, 60, 378, …, ?, 1, 1, …} – или даже
• {11, 18, 47, 59, 377, …, ?, 0, 0, …}
• Ура, мы изобрели Lucene, Sphinx, Google...
37. Нельзя ли еще лучше?
• А что, если там “стопслово”?
• docs {1,2,3,5,6,9,10,11,12,…} x 10M+ раз
• deltas {1,1,2,2,1,3,1,1,1,…}
• Даже по 1 байту = 8 бит на дельту чота жырно
• А давайте группы по 32 дельты?
• byte nbits; uint deltas[nbits];
• 32x{1} – было 32 байта, стало 1 (!!!) байт
• 32x{1,2,3,4} – было 32, стало 9 байт
• Ура, мы изобрели типа FOR (Frame Of Reference)
38. Обратите внимание, локальный K
• Оригинал
• 32 docid * 4 / 8 bytes == 128 / 256 bytes
• small-deltas + varint => 32 bytes, k=0.25 / 0.12
• small-deltas + FOR => 9 bytes, k=0.07 / 0.035
• big-deltas так просто не сдаются, конечно
• Поэтому общий результат всегда хуже
39. Но совсем хорошо – совсем тупо!
• Пусть max(doc_id) = M – и авось M << 2^32
• Тупо строим bitmap на M бит и всё
• А ещё такие битмапы дико быстро пересекать
• Работает НЕ всегда!
• Пусть слово матчит N документов, типа 3 шт, на M = 10 млн бит
• При N < M/32 будет лучше даже vector<int> без сжатия!!!
• При N < M/8 лучше (?) vector<byte> deltas
• Тупо, но работает, чё (ещё и лучше всех)
• k=0.031 / 0.016, кстати
40. Как ещё “преобразовывать”?
• Пажжи, а если у меня не текст и не поиск?!
• А вот у меня лог (BIGINT uid, BIGINT tstamp)
• На самом деле колонок больше, но пусть так
• Точность до микросекунды, потому bigint
• Пользователей мало, но мы амбициозны
• Не, tstamp растет (разумеется)
• А далее userid типа рандомный
• Всё, расходимся, такое не сжать?
41. Сжимаем “несжимаемое”
• Долбим (uid, tstamp) на блоки
• Лучше побольше, 128+ записей
• В каждом блоке пробуем
• RLE == N повторов значения X => {X, N}
• MinDelta == из всех uid вычитаем min(uid)
• BlockDict == если мало разных значений, стром LUT
• DeltaRange == вместо значений кодируем дельты
• CommonDelta == словарь дельт и entropy coder
• …
42. Сжимаем “несжимаемое”
• Растущие tstamp => вчистую DeltaRange
• “Случайные” uid, ip и т.п. => ну, зависит
• Если чутка неслучайные, что-то сработает
• На крайняк, тупо урезать uid до 5-6 байт :P
• Залетные неслучайные city_id, price, ...
=> ужмутся в разы, до единиц бит, см. K
• Ура, мы изобрели Vertica
• И возможно ClickHouse (но это не точно)
• Но Миловидов пока не опроверг!!!
43. Я вообще может по ML/DS угораю
• Нейросетка double[512] насчитала
• Памяти в мобиле ваще нет
• Все остальные трюки не работают норм
• Округление == тоже трансформ? Или код?
• short[512] ровно в 4 раза меньше!!!
• Тупо, но работает, чё
• Гусары, ни слова про PCA
44. Я ничего никогда не храню!!!
• Но переменные-то в программе бывают?
struct Token {
int start, len, pos;
bool is_stop;
int multi_pos_len; // mostly 0
}
// sizeof(Token) == 20
45. True magic story, bro
• Байка из Sphinx, ага (про snippets)
• Раз, парсим текст – что мееедленно
• Два, обходим токены – ищем лучшие спаны
• Три, обходим токены – генерируем ответ
• Первая реализация, vector<Token>
• Плюс токены были ещё толще, 40+ байт
• С документами в 10 kb все работало отлично
• Но тут прилетел документ в 226000 kb
• Сожрал 4+ gb памяти и упал
46. True magic story, bro
• Вторая реализация, жатый поток
• Раз, парсим – и тут же жмем
• Два, обходим – разжимая “по одному”
• Три, опять обходим – опять разжимая
• Ожидания?
• ref жрал, выходит, до ~20x doc_size
• медленно, хотелось уложиться в 2x от ref
• компактно, но чтобы ~1x doc_size
=> на мелких документах был план отключить
47. True magic story, bro
• Реальность?
• компактнее, чем ожидалось (0.3…0.5 doc_size)
• всегда быстрее, чем ref (чуть не 2x иногда)
• отлично, 1 вариант кода, а не 2 варианта
• В чём обещанная МАГИЯ?
• Быстро // дешево // хорошо, да?
49. Да я вообще не программист!!!
• Программы хоть запускать умеешь?!
• Вчера были gzip, bzip2 – и всё
• Сегодня есть lz4, snappy, brotli, zstd, 7z…
• Сегодня нужно выбирать – всегда есть чего
• Особенно если ты всё же программист
• Что важно – есть кодеки “на скорости RAM”
• Втыкаются везде, см. MySQL, Postgres, …
51. Зачем вообще был этот
доклад?!?!• “Все” типа умеют в vector/list/hash
• Уметь надо во много больше
• Умеют немногие – а что изучать?
• Сжатие может не понадобиться никогда
• Сжатие может сильно помочь – см. магия
• Сложного там ничего – см. доклад
• Плюс актуальные ключевики – вот они:
52. keywords
• Как ловко кодировать какие-то числа?
• Elias, Rice, Golomb, Huffman, arithmetic, range coder, ANS family,
FOR, PFOR-delta, S9, S16, varint, group varint, LSIC…
• Как ещё поуменьшить данные?
• roundoff, bitmaps, deltas, LUTs, dicts, LZ77/78, LZW, LZMA, PPM, PAQ,
context modeling…
• Какую подцепить мегабиблиотеку?
• lz4, zstd, brotli, snappy, lzma… а то вдруг oodle
53. D.I.Y.
• Так эта! Как быстро/просто написать своё!?
• Глянуть данные, посчитать частоты
• Выдумать нехитрый (и лучше байтовый) код
• Суперчастые случаи – предельно коротко
• Редкие случаи – почти пофиг (!) насколько длинно
• Частое паковать, редкое раздувать
• На худой конец, возьмите varint / “mysql” / lsic
• Иногда (иногда!) случается чудо
• И быстрее, и компактнее (но таки дороже!!!)