HighLoad++ 2017
Зал «Пекин + Шанхай», 8 ноября, 18:00
Тезисы:
http://www.highload.ru/2017/abstracts/2960.html
При изучении алгоритмов и структур данных я предлагаю студентам закрепить знания и попытаться сделать мир лучше, выполнив небольшие проекты по внедрению эффективных алгоритмов в свободное программное обеспечение. В этом докладе я расскажу несколько идей для таких проектов.
Мы рассмотрим существующие фрагменты исходного кода, поговорим о том, что в нём можно допилить, и обсудим, сколько баллов за это надо давать.
Реализацией идей могут заняться, разумеется, все желающие.
7. Проекты создаются «для замены»
▌ Почему так происходит?
› «Эффект второй системы» Ф. Брукса
останавливает оригинальных изобретателей
› Отсутствие новизны в идее останавливает серийных
людей, оптимизирующих ожидаемую прибыль
7
8. «Пугающие идеи» Пола Грэма (2012)
1. Новый поисковик
2. Новый e-mail
3. Замена университетам
4. Замена Голливуду
5. Замена Apple
6. Новый компилятор
7. Замена медицинской диагностике
paulgraham.com/ambitious.html 8
12. Проекты создаются «для замены»
В проекте настоящего велосипедиста всегда есть работа
для
› Инженера
› Учёного
▌ И в основном это работа по применению знаний из
библиотеки
12
13. Почему этим нужно заниматься вам?
Участие в Open Source
› Это интересно
› Учит новому
› Украшает CV
▌ Стоит браться за сложные для понимания вещи
13
14. Почему этим нужно заниматься вам?
На самом деле
Выполнение SLA сервис-провайдером
› Тренировка разработчиков на случай экстренного багфикса
› Репутация компании в сообществе для получения поддержки
▌ Стоит браться за сложные для понимания вещи
14
25. › Кэш-локальность
› Минимальный возможный
размер до 10 000
› Время старта
› Необходимость настройки
hash_max_size
и hash_bucket_size
+ -
Хэш-таблица nginx
25
Плюсы Минусы
26. Какой структурой можно заменить?
M. Fredman, J. Komlos, E. Szemeredi, Storing a Sparse Table
with O(1) Worst Case Access Time, Journal of the ACM,
31(3):538-544, 1984.
26
▌ Известен как FKS-алгоритм:
› Двухуровневое хэширование
› Рандомизированный подбор хэш-функции второго уровня
27. Какой структурой можно заменить?
M. Fredman, J. Komlos, E. Szemeredi, Storing a Sparse Table
with O(1) Worst Case Access Time, Journal of the ACM,
31(3):538-544, 1984.
27
▌ Известен как FKS-алгоритм:
› Двухуровневое хэширование
› Рандомизированный подбор хэш-функции второго уровня
› Сложен в реализации
› Больше затрагиваемых кэш-линий в запросе
28. Какой структурой можно заменить?
R. Pagh, F. F. Rodler. Cuckoo Hashing // Algorithms — ESA
2001. — 2001. — Т. 2161. — С. 121–133.
28
▌ Хэширование кукушки
› Простая реализация
› Три кэш-линии на поиск
43. Сортировка в СУБД
▌ Зачастую СУБД использует внешнюю сортировку
▌ данных существенно больше рабочей памяти
› MariaDB github.com/MariaDB/server/blob/10.2/mysys/mf_qsort.c
› PostgreSQL
wiki.postgresql.org/wiki/GSoC_2017#Sorting_algorithms_benchmark_and_imple
mentation
В MySQL используют std::sort – это introsort 43
51. InnoDB
51
case PAGE_CUR_RTREE_INSERT:
double increase;
double area;
cmp = cmp_dtuple_rec_with_gis(
tuple, rec, offsets, PAGE_CUR_WITHIN);
if (cmp != 0) {
increase = rtr_rec_cal_increase(
tuple, rec, offsets, &area);
/* Once it goes beyond DBL_MAX,
it would not make sense to record
such value, just make it
DBL_MAX / 2 */
if (increase >= DBL_MAX) {
increase = DBL_MAX / 2;
}
github.com/MariaDB/server/blob/10.3/storage/innobase/gis/gis0sea.cc#L1756 52
52. InnoDB
52
if (increase < least_inc) {
least_inc = increase;
best_rec = rec;
} else if (best_rec
&& best_rec == first_rec) {
/* if first_rec is set,
we will try to avoid it */
least_inc = increase;
best_rec = rec;
}
}
break;
github.com/MariaDB/server/blob/10.3/storage/innobase/gis/gis0sea.cc#L1756 53
53. InnoDB
53
case PAGE_CUR_RTREE_INSERT:
double increase;
double area;
cmp = cmp_dtuple_rec_with_gis(
tuple, rec, offsets, PAGE_CUR_WITHIN);
if (cmp != 0) {
increase = rtr_rec_cal_increase(
tuple, rec, offsets, &area); area unused
/* Once it goes beyond DBL_MAX,
it would not make sense to record
such value, just make it
DBL_MAX / 2 */
if (increase >= DBL_MAX) {
increase = DBL_MAX / 2;
}
github.com/MariaDB/server/blob/10.3/storage/innobase/gis/gis0sea.cc#L1756 54
54. InnoDB
54
/* Since the mbr could be a point or a linestring, in this case, area of
mbr is 0. So, we define this macro for calculating the area increasing
when we need to enlarge the mbr. */
#define LINE_MBR_WEIGHTS 0.001
area = amax - amin;
if (area == 0) {
a_area *= LINE_MBR_WEIGHTS;
} else {
a_area *= area;
}
github.com/MariaDB/server/blob/10.3/storage/innobase/gis/gis0geo.cc#L719 54
55. Не R-tree единым жив ГИС
Gaede, Gunther: Multidimensional access methods https://dl.acm.org/citation.cfm?id=280279 55
61. 61
В начале работы
1. Напишите в рассылку проекта
2. Дождитесь ответа
3. Ищите предыдущие попытки реализации
4. Пишите о своём прогрессе
62. Takeaway
▌ Open Source, даже очень крутой, делают обычные люди
▌ Если вы можете:
› разобраться в сложных (на первый взгляд) алгоритмах
› умеете писать хороший код
ваше участие может быть полезно почти любому
крупному проекту
62