SlideShare a Scribd company logo
1 of 87
Download to read offline
Считаем уникальные
элементы
Константин Игнатов
7 ноября 2016
∙ Имеем поток элементов
∙
Хотим знать, сколько их было, без повторов
∙ Не хотим хранить поток целиком
Что ищем
2
SELECT COUNT DISTINCT . . .
∙ при оптимизации и планировании запросов к БД
∙ при оценке количества уникальных пар SRC-DST
в роутере
∙
при поиске паттернов в больших графах или
массивах данных
∙ при web-аналитике
Где нужно
3
U множество всех возможных элементов, n = |U|
S ⊂ U множество уникальных элементов в потоке
F0 = |S| количество элементов в этом множестве
ut ∈ S элемент на позиции t в потоке
Ut ⊂ S множество уникальных элементов, которые мы видели к моменту t
Считаем точно
4
∙
Сколько стоит добавить один элемент в
множество?
∙ сортированный список
∙ битовая маска из n = |U| бит
∙ Сколько стоит посчитать количество элементов?
∙
А если элементов много? Очень?
Считаем точно
4
∙ ˜F0 = (1 ± 𝜀) F0, 𝜀 > 0, 𝜀 ≪ 1
∙
Как гарантировать, что ошибка будет меньше 𝜀?
∙ Насколько меньше памяти можно использовать?
∙
Как быть?
Считаем приблизительно
5
∙ ˜F0 = (1 ± 𝜀) F0, 𝜀 > 0, 𝜀 ≪ 1
∙
Как гарантировать, что ошибка будет меньше 𝜀?
∙ Насколько меньше памяти можно использовать?
∙ Можно добиться линейного уменьшения
∙ Ценой экспоненциального увеличения ошибки
∙
Как быть?
Считаем приблизительно
5
1983 Flajolet, Martin Probabilistic Counting Algorithms for Data Base
Applications
1996 Alon, Matias, Szegedy The Space Complexity of Approximating the
Frequency Moments
2002 Bar-Yossef, Jayram, Kumar, Sivakumar, Trevisan Counting Distinct
Elements in a Data Stream
2003 Durand, Flajolet LogLog Counting of Large Cardinalities
2003 Indyk, Woodruff Tight Lower Bounds for the Distinct Elements Problem
State of art
6
2007 Flajolet, Fusy, Gandouet, Meunier HyperLogLog: the analysis of a
near-optimal cardinality estimation algorithm
2010 Kane, Nelson, Woodruff Optimal Algorithm for the Distinct Elements
Problem
2012 Helmi, Lumbroso, Martinez, Viola Data Streams as Random Permutations:
the Distinct Element Problem
State of art
6
∙ Кратко об этапах работы алгоритма
∙ Подробно об элементах алгоритмов
∙ Хэш-функции
∙
Разделение потока
∙
Статистики
∙
Подробно о том, почему всё это работает
План
7
bloom filter: встречался ли этот элемент в потоке?
heavy hiters: какие элементы встречались чаще всего?
F∞moment: как часто встречался самый распространённый элемент
online pattern discovery: какие элементы чаще всего встречались
вместе?
Связанные задачи
8
Bloom Filter
9
Bloom Filter
9
Bloom Filter
9
Bloom Filter
9
Bloom Filter
9
Bloom Filter
9
Sketch
10
Идея: храним не всю информацию, а только то, что необходимо для ответа
∙ В случае вероятностного алгоритма (вариант):
∙ Храним и обновляем несколько значений x,
вычисленных из увиденного потока
∙
E [f (x)] асимптотически равно оцениваемой
величине
∙ Var [f (x)] должно быть мало
Sketch
10
Sketch
10
Инициализация
(для 𝜀 = 0.32)
Выбрать большое простое число p, например 5247972723348490517
Выбрать три функции, например:
h(x) = (3813295331020233847x + 2061310418014472126) mod p
g1(x) = (4905134244493838961x + 339751972700966608) mod p mod 1000
g2(x) = (3462845419123084402x3+2920301559511116865x2+4398447080453503003x+
1489413524815015911) mod p mod 10
Создать сжатый массив C из m = 10 элементов, равных 0.
Вариант алгоритма
11
Для каждого объекта x
1 r = lsb (h(x)) — количество нулей справа в
бинарном представлении хеша + 1
2 i = g(x)
3 C[i] = max (C[i], r)
Вариант алгоритма
11
Получение результата
1 r = min(C)
2 T — количество элементов в C, которые больше r
3 Ответ: 2r+1log(1−T
m )
log(1− 1
m )
Вариант алгоритма
11
∙ Будем рассматривать алгоритм, который:
∙
Отвечает с некоторой точностью 𝜀
F0,𝜀 = F0 · (1 ± 𝜀)
∙ Может ответить с большей ошибкой с
вероятностью (1 − 𝛿) < 1
2
(𝜀, 𝛿)-аппроксимация
Вероятностные алгоритмы
12
∙
Вероятность ошибки: 𝛿 < 1
2
∙
Вероятность не допустить ошибку: 1 − 𝛿 > 1
2
∙ При R повторах:
∙ Биноминальное распределение
∙
Нужно R
2 + 1 или больше верных ответов
∙
R∑︀
i=R
2 +1
(︀R
i
)︀
(1 − 𝛿)i
𝛿R−i
Уменьшение вероятности ошибки
13
h : U → {0, 1, 2, 3, . . . , m − 1}
или
h : U →
{︂
0,
1
m
,
2
m
,
3
m
, . . . , 1
}︂
как правило, m |U|
∙
В современных реализациях потоковых
алгоритмов, как правило:
∙
log m = 64 (64-битные хэш-функции).
Хэш-функции
14
∙ Теоретически нам нужно, чтобы вероятность
увидеть любой элемент была одинаковой
∙
На практике так не бывает
∙ Используем хэш-функции (теория):
∙ вероятность встретить определённый хэш 1
m
∙ даже если исходные объекты «скучкованны»
Хэш-функции и случайные величины
15
∙ Абсолютно случайная хэш-функция:
∙ Для каждого элемента в U генерируем
случайное число от 0 до m
∙
Храним n = |U| хэшей в массиве (векторе)
∙
O (n log m) места в памяти
∙
Часто нам нужно несколько хэш-функций...
Память для хэш-функций
16
∙ На практике:
∙ используется быстрая детерминистическая
функция от нескольких переменных
∙
фиксируются все переменные кроме одной
∙ нужно хранить только параметры функции
∙ как правило,O (log m)
Память для хэш-функций
16
Хэш-функции
17
Хэш-функции
17
Хэш-функции
17
Хэш-функции
17
Хэш-функции
17
Хэш-функции
17
435839x + 117959 mod 567857
Хэш-функции
17
Хэш-функции
17
Хэш-функции
17
Хэш-функции
17
Хэш-функции
17
Хэш-функции
17
Хэш-функции
17
∙ При абсолютно случайной хэш-функции все
значения не зависят друг от друга:
Pr (h (x1) = c1, h (x2) = c2, . . . , h (xm) = cm) = 1
mm
∀
{︀
ci ∈ 0, m − 1
}︀
Семейства хэш-функций
18
∙ На практике нам достаточно независимости
только для небольшого числа хэшей k
∙ Выбираем хэш-функцию случайно из
некоторого семейства H
∙ например, для k = 2,(ax + b) mod p mod m,
0 < a < p, 0 b < p:
Pr
h∈H
(h (x1) = c1 ∧ h (x2) = c2) = 1
m2
∀x1, x2 ∈ U, ∀c1, c2 ∈ 0, m − 1
Семейства хэш-функций
18
∙ Для произвольного k
h (x) =
[︂(︂k−1∑︀
i=0
aixi
)︂
mod p
]︂
mod m
Pr (h (x1) = c1 ∧ h (x2) = c2 ∧ . . . ∧ h (xk) = ck) = 1
mk
∀x1 . . . xk ∈ U, ∀c1, . . . ck ∈ 0, m − 1
Семейства хэш-функций
18
∙ Вероятность верного ответа (1 − 𝛿) и память
∙ Вероятность и сложность (время выполнения)
∙ Точность 𝜀 и память:
∙ теоретически 𝜀 = 1√
M
∙
M — количество используемых хэш-функций
Компромиссы
19
∙ В некоторый момент переключаем выполнение
алгоритма с одного исполнителя (Алиса) к
другому (Боб)
∙ Алиса при этом должна отправить Бобу
сообщение. Дальше поток видит только Боб
∙ В конце Боб должен сказать, сколько было
элементов в потоке с (𝜀, 𝛿) аппроксимацией
∙ Размер сообщения и есть потребление памяти
Теоретическое потребление памяти
20
∙
Теоретический предел: O
(︀ 1
𝜀2 + log n
)︀
∙
Наиболее распространённый на практике
алгоритм: O
(︀ 1
𝜀2 log log n
)︀
n = |U| — количество возможных объектов (e.g. 264)
log n — количество бит в бинарном представлении n (e.g. 64)
log log n — количество бит, нужных для записи количества бит в n (e.g. 6)
Теоретическое потребление памяти
20
Сколько элементов в bloom-фильтре?
21
Сколько элементов в bloom-фильтре?
21
Сколько элементов в bloom-фильтре?
21
Сколько элементов в bloom-фильтре?
21
Переделываем bloom
22
Переделываем bloom
22
Переделываем bloom
22
∙ Сколько чисел из 0, m имеют
∙ k нулей в конце бинарного представления?
∙
k нулей в начале?
∙ k нулей или единиц подряд?
Вероятность «редкой птицы»
23
Pr (0 zeros) = 1
2
Pr (1 zero) = 1
2
Pr(2 zeros) = 1
4
Pr(k zeros) = 1
2k
Вероятность «редкой птицы»
23
Pr (0 zeros) = 1
2
Pr (1 zero) = 1
2
Pr(2 zeros) = 1
4
Pr(k zeros) = 1
2k
∙
А после N увиденных
элементов?
Вероятность «редкой птицы»
23
Pr (0 zeros) = 1
2
Pr (1 zero) = 1
2
Pr(2 zeros) = 1
4
Pr(k zeros) = 1
2k
∙
А после N увиденных
элементов?
∙
1 −
(︀
1 − 1
2k
)︀N
Вероятность «редкой птицы»
23
∙ Итого: в «сломанном» bloom-фильтре примерно
2r
𝜑 элементов
∙ r — номер первого бита 1 справа
∙
𝜑 — константа
∙ Нужно объединить результаты нескольких
экспериментов (иначе будут ответы, кратные
степеням 2)
Вероятность «редкой птицы»
23
𝜑 = 2−1
2 e 𝛾 2
3
∞∏︁
𝜌=1
[︂
(4𝜌 + 1)(4𝜌 + 2)
(4𝜌)(4𝜌 + 3)
]︂(−1) 𝜈(𝜌)
≈ 0.77351
𝜈(𝜌) — количество 1-бит в бинарном представлении 𝜌
𝛾 = −
∞´
0
ln x
ex dx — постоянная Эйлера
Интересная константа
24
∙ Плохо: ответы, кратные степеням 2
∙
Плохо: высокий разброс ошибки
∙ Хотим провести M независимых экспериментов,
не дублируя поток
∙
Заводим M корзинок и раскладываем элементы в
них при помощи ещё одной хэш-функции
∙ как при балансировке нагрузки
∙ одинаковые элементы всегда попадают в один
«подпоток»
Разделение потока
25
∙ NB: Первые элементы (K ∼ m) потока:
∙ NB: Сколько останется пустых корзинок?
∙ Pr (bi) = 1
m Pr (∼ bi) =
(︀
1 − 1
m
)︀
∙ Pr (∼ bi after K) =
(︀
1 − 1
m
)︀K
∙ Pr (bi after K) = 1 −
(︀
1 − 1
m
)︀K
∙ Все корзинки одинаковые:
E (emty) = m
(︁
1 −
(︀
1 − 1
m
)︀K
)︁
Разделение потока
25
∙ применяем «сломанный bloom-фильтр» для
каждой корзинки, считаем среднее
∙ Точность: 𝜀 = 0.78√
M
∙
Память: O
(︀ 1
𝜀2 log n
)︀
∙ Заменив арифметическое среднее на
гармоническое, получим 𝜀 = 1.02√
M
Разделение потока
25
∙ Нам не нужно хранить сами значения в
«регистрах»
∙ Достаточно индекса нужного бита
∙
вот тут и получается O
(︀ 1
𝜀2 log log n
)︀
Наблюдение 1
26
∙ В получившемся массиве почти все числа будут
одинаковыми
∙
Можно хранить минимальное значение отдельно,
а остальное — сжать
∙ Существуют компактные структуры данных с
быстрым обновлением и запросами
∙ Память: O (sum (C)) (на практике: 3–4 1
𝜀2 )
∙ E (#bucket ≈ log F0) = m
(︁
1 −
(︀
1 − 1
m
)︀F0
)︁
∙
остаётся выразить F0
Наблюдение 2
27
∙
Храним sketch за каждые несколько секунд
∙
При запросе объединяем все затронутые
интервалы
∙ учитываем, что min хранится отдельно
∙
Запускаем последний шаг алгоритма
∙ Можем получить оценку не только за
произвольный интервал времени,
∙ но и за объединение любых произвольных
интервалов
Я всё-таки хочу знать...
28
Redis
∙ Специальная структура данных
∙
Специальные команды для этой
структуры
∙ Удобно для работы с небольшим
количеством множеств
Реализации
29
Clickhouse
∙ Умеет делать запросы с использованием
вероятностных алгоритмов
∙
По-умолчанию uniq() использует
вероятностный алгоритм
∙ Понятие состояния алгоритма и
специальный тип данных
Реализации
29
Спасибо
Константин Игнатов
@podshumok
kv@qrator.net
2r (r — количество 1 в конце слова x):
0 1 0 1 0 1 1 1 x
1 0 1 0 1 0 0 0 ∼ x
0 1 0 1 1 0 0 0 x + 1
0 0 0 0 1 0 0 0 ∼ x& (x + 1) = 2r
Bit tricks
31
x mod y (нам не нужен результат деления)
∙
x % p = ( x >> 61) + ( x & p)
(если p = 261
− 1)
∙
( ( uint128 ) x * ( uint128 )p ) >> 64
Bit tricks
31
CRC
CLMUL
POPCNT
Bit tricks
31
Порядковая статистика
32
Порядковая статистика
32
Порядковая статистика
32
Порядковая статистика
32
Порядковая статистика
32
Порядковая статистика
32
Порядковая статистика
32
Порядковая статистика
32
Порядковая статистика
32
Порядковая статистика
32
Порядковая статистика
32
Порядковая статистика
32
Порядковая статистика
32
Порядковая статистика
32

More Related Content

What's hot

Семинар 3. Многопоточное программирование на OpenMP (часть 3)
Семинар 3. Многопоточное программирование на OpenMP (часть 3)Семинар 3. Многопоточное программирование на OpenMP (часть 3)
Семинар 3. Многопоточное программирование на OpenMP (часть 3)Mikhail Kurnosov
 
Семинар 4. Многопоточное программирование на OpenMP (часть 4)
Семинар 4. Многопоточное программирование на OpenMP (часть 4)Семинар 4. Многопоточное программирование на OpenMP (часть 4)
Семинар 4. Многопоточное программирование на OpenMP (часть 4)Mikhail Kurnosov
 
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Mikhail Kurnosov
 
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Alexey Paznikov
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Mikhail Kurnosov
 
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?tfmailru
 
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...pgdayrussia
 
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Mikhail Kurnosov
 
Семинар 1. Многопоточное программирование на OpenMP (часть 1)
Семинар 1. Многопоточное программирование на OpenMP (часть 1)Семинар 1. Многопоточное программирование на OpenMP (часть 1)
Семинар 1. Многопоточное программирование на OpenMP (часть 1)Mikhail Kurnosov
 
Лекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиЛекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиMikhail Kurnosov
 
Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Mikhail Kurnosov
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Mikhail Kurnosov
 
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...Alexey Paznikov
 
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...Alexey Paznikov
 
Валентин Коновалов "Кэш МЯК"
Валентин Коновалов "Кэш МЯК"Валентин Коновалов "Кэш МЯК"
Валентин Коновалов "Кэш МЯК"Yandex
 
Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Mikhail Kurnosov
 
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...Alexey Paznikov
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPMikhail Kurnosov
 
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Mikhail Kurnosov
 

What's hot (20)

Семинар 3. Многопоточное программирование на OpenMP (часть 3)
Семинар 3. Многопоточное программирование на OpenMP (часть 3)Семинар 3. Многопоточное программирование на OpenMP (часть 3)
Семинар 3. Многопоточное программирование на OpenMP (часть 3)
 
Семинар 4. Многопоточное программирование на OpenMP (часть 4)
Семинар 4. Многопоточное программирование на OpenMP (часть 4)Семинар 4. Многопоточное программирование на OpenMP (часть 4)
Семинар 4. Многопоточное программирование на OpenMP (часть 4)
 
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
 
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)
 
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
 
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...
 
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
 
Семинар 1. Многопоточное программирование на OpenMP (часть 1)
Семинар 1. Многопоточное программирование на OpenMP (часть 1)Семинар 1. Многопоточное программирование на OpenMP (часть 1)
Семинар 1. Многопоточное программирование на OpenMP (часть 1)
 
Лекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиЛекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимости
 
Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
 
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
 
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
 
Валентин Коновалов "Кэш МЯК"
Валентин Коновалов "Кэш МЯК"Валентин Коновалов "Кэш МЯК"
Валентин Коновалов "Кэш МЯК"
 
Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)
 
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
 
Tarantool_qs
 Tarantool_qs Tarantool_qs
Tarantool_qs
 
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
 

Similar to Хочу знать, сколько уникальных посетителей было на моём сайте за произвольный интервал времени в прошлом / Константин Игнатов (Qrator Labs)

Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1Technopark
 
Обработка коллекций. Единая суть и множество проявлений
Обработка коллекций. Единая суть и множество проявленийОбработка коллекций. Единая суть и множество проявлений
Обработка коллекций. Единая суть и множество проявленийcorehard_by
 
Алгоритмы и структуры данных весна 2014 лекция 1
Алгоритмы и структуры данных весна 2014 лекция 1Алгоритмы и структуры данных весна 2014 лекция 1
Алгоритмы и структуры данных весна 2014 лекция 1Technopark
 
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...corehard_by
 
DUMP-2013 Наука и жизнь - Приближённый подсчёт количества уникальных элементо...
DUMP-2013 Наука и жизнь - Приближённый подсчёт количества уникальных элементо...DUMP-2013 Наука и жизнь - Приближённый подсчёт количества уникальных элементо...
DUMP-2013 Наука и жизнь - Приближённый подсчёт количества уникальных элементо...it-people
 
Вероятностные структуры данных
Вероятностные структуры данныхВероятностные структуры данных
Вероятностные структуры данныхAndrii Gakhov
 
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...Ontico
 
Лекция 1. Амортизационный анализ (Amortized analysis)
Лекция 1. Амортизационный анализ (Amortized analysis)Лекция 1. Амортизационный анализ (Amortized analysis)
Лекция 1. Амортизационный анализ (Amortized analysis)Mikhail Kurnosov
 
Лекция 1. Анализ эффективности алгоритмов
Лекция 1. Анализ эффективности алгоритмовЛекция 1. Анализ эффективности алгоритмов
Лекция 1. Анализ эффективности алгоритмовMikhail Kurnosov
 
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНСit-people
 
Обработка данных в RTB: быстро, дешево и на 98% точно
Обработка данных в RTB:  быстро, дешево и на 98% точноОбработка данных в RTB:  быстро, дешево и на 98% точно
Обработка данных в RTB: быстро, дешево и на 98% точноPavel Kalaidin
 
Многопоточное Программирование - Теория и Практика
Многопоточное Программирование - Теория и ПрактикаМногопоточное Программирование - Теория и Практика
Многопоточное Программирование - Теория и ПрактикаRoman Elizarov
 
Евгений Лазин. Неизменяемая структура данных HAMT для создания БД в памяти
Евгений Лазин. Неизменяемая структура данных HAMT для создания БД в памятиЕвгений Лазин. Неизменяемая структура данных HAMT для создания БД в памяти
Евгений Лазин. Неизменяемая структура данных HAMT для создания БД в памятиFProg
 
Haskell Type System with Dzmitry Ivashnev.
Haskell Type System with Dzmitry Ivashnev.Haskell Type System with Dzmitry Ivashnev.
Haskell Type System with Dzmitry Ivashnev.Sergey Tihon
 
Многопоточные Алгоритмы (для BitByte 2014)
Многопоточные Алгоритмы (для BitByte 2014)Многопоточные Алгоритмы (для BitByte 2014)
Многопоточные Алгоритмы (для BitByte 2014)Roman Elizarov
 
Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...
Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...
Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...Alexey Paznikov
 

Similar to Хочу знать, сколько уникальных посетителей было на моём сайте за произвольный интервал времени в прошлом / Константин Игнатов (Qrator Labs) (20)

Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1
 
Обработка коллекций. Единая суть и множество проявлений
Обработка коллекций. Единая суть и множество проявленийОбработка коллекций. Единая суть и множество проявлений
Обработка коллекций. Единая суть и множество проявлений
 
Алгоритмы и структуры данных весна 2014 лекция 1
Алгоритмы и структуры данных весна 2014 лекция 1Алгоритмы и структуры данных весна 2014 лекция 1
Алгоритмы и структуры данных весна 2014 лекция 1
 
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
 
DUMP-2013 Наука и жизнь - Приближённый подсчёт количества уникальных элементо...
DUMP-2013 Наука и жизнь - Приближённый подсчёт количества уникальных элементо...DUMP-2013 Наука и жизнь - Приближённый подсчёт количества уникальных элементо...
DUMP-2013 Наука и жизнь - Приближённый подсчёт количества уникальных элементо...
 
Вероятностные структуры данных
Вероятностные структуры данныхВероятностные структуры данных
Вероятностные структуры данных
 
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
 
Лекция 1. Амортизационный анализ (Amortized analysis)
Лекция 1. Амортизационный анализ (Amortized analysis)Лекция 1. Амортизационный анализ (Amortized analysis)
Лекция 1. Амортизационный анализ (Amortized analysis)
 
Лекция 1. Анализ эффективности алгоритмов
Лекция 1. Анализ эффективности алгоритмовЛекция 1. Анализ эффективности алгоритмов
Лекция 1. Анализ эффективности алгоритмов
 
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
 
Обработка данных в RTB: быстро, дешево и на 98% точно
Обработка данных в RTB:  быстро, дешево и на 98% точноОбработка данных в RTB:  быстро, дешево и на 98% точно
Обработка данных в RTB: быстро, дешево и на 98% точно
 
Многопоточное Программирование - Теория и Практика
Многопоточное Программирование - Теория и ПрактикаМногопоточное Программирование - Теория и Практика
Многопоточное Программирование - Теория и Практика
 
Евгений Лазин. Неизменяемая структура данных HAMT для создания БД в памяти
Евгений Лазин. Неизменяемая структура данных HAMT для создания БД в памятиЕвгений Лазин. Неизменяемая структура данных HAMT для создания БД в памяти
Евгений Лазин. Неизменяемая структура данных HAMT для создания БД в памяти
 
Purely practical data structures
Purely practical data structuresPurely practical data structures
Purely practical data structures
 
Haskell Type System with Dzmitry Ivashnev.
Haskell Type System with Dzmitry Ivashnev.Haskell Type System with Dzmitry Ivashnev.
Haskell Type System with Dzmitry Ivashnev.
 
Многопоточные Алгоритмы (для BitByte 2014)
Многопоточные Алгоритмы (для BitByte 2014)Многопоточные Алгоритмы (для BitByte 2014)
Многопоточные Алгоритмы (для BitByte 2014)
 
Рекурсия. Поиск
Рекурсия. ПоискРекурсия. Поиск
Рекурсия. Поиск
 
Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...
Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...
Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...
 
4 algoritm
4 algoritm4 algoritm
4 algoritm
 
Алгоритм
АлгоритмАлгоритм
Алгоритм
 

More from Ontico

One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...Ontico
 
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Ontico
 
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Ontico
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Ontico
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Ontico
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)Ontico
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Ontico
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Ontico
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)Ontico
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)Ontico
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Ontico
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Ontico
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Ontico
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Ontico
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)Ontico
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Ontico
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Ontico
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...Ontico
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Ontico
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Ontico
 

More from Ontico (20)

One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
 
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
 
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
 

Хочу знать, сколько уникальных посетителей было на моём сайте за произвольный интервал времени в прошлом / Константин Игнатов (Qrator Labs)

  • 2. ∙ Имеем поток элементов ∙ Хотим знать, сколько их было, без повторов ∙ Не хотим хранить поток целиком Что ищем 2
  • 3. SELECT COUNT DISTINCT . . . ∙ при оптимизации и планировании запросов к БД ∙ при оценке количества уникальных пар SRC-DST в роутере ∙ при поиске паттернов в больших графах или массивах данных ∙ при web-аналитике Где нужно 3
  • 4. U множество всех возможных элементов, n = |U| S ⊂ U множество уникальных элементов в потоке F0 = |S| количество элементов в этом множестве ut ∈ S элемент на позиции t в потоке Ut ⊂ S множество уникальных элементов, которые мы видели к моменту t Считаем точно 4
  • 5. ∙ Сколько стоит добавить один элемент в множество? ∙ сортированный список ∙ битовая маска из n = |U| бит ∙ Сколько стоит посчитать количество элементов? ∙ А если элементов много? Очень? Считаем точно 4
  • 6. ∙ ˜F0 = (1 ± 𝜀) F0, 𝜀 > 0, 𝜀 ≪ 1 ∙ Как гарантировать, что ошибка будет меньше 𝜀? ∙ Насколько меньше памяти можно использовать? ∙ Как быть? Считаем приблизительно 5
  • 7. ∙ ˜F0 = (1 ± 𝜀) F0, 𝜀 > 0, 𝜀 ≪ 1 ∙ Как гарантировать, что ошибка будет меньше 𝜀? ∙ Насколько меньше памяти можно использовать? ∙ Можно добиться линейного уменьшения ∙ Ценой экспоненциального увеличения ошибки ∙ Как быть? Считаем приблизительно 5
  • 8. 1983 Flajolet, Martin Probabilistic Counting Algorithms for Data Base Applications 1996 Alon, Matias, Szegedy The Space Complexity of Approximating the Frequency Moments 2002 Bar-Yossef, Jayram, Kumar, Sivakumar, Trevisan Counting Distinct Elements in a Data Stream 2003 Durand, Flajolet LogLog Counting of Large Cardinalities 2003 Indyk, Woodruff Tight Lower Bounds for the Distinct Elements Problem State of art 6
  • 9. 2007 Flajolet, Fusy, Gandouet, Meunier HyperLogLog: the analysis of a near-optimal cardinality estimation algorithm 2010 Kane, Nelson, Woodruff Optimal Algorithm for the Distinct Elements Problem 2012 Helmi, Lumbroso, Martinez, Viola Data Streams as Random Permutations: the Distinct Element Problem State of art 6
  • 10. ∙ Кратко об этапах работы алгоритма ∙ Подробно об элементах алгоритмов ∙ Хэш-функции ∙ Разделение потока ∙ Статистики ∙ Подробно о том, почему всё это работает План 7
  • 11. bloom filter: встречался ли этот элемент в потоке? heavy hiters: какие элементы встречались чаще всего? F∞moment: как часто встречался самый распространённый элемент online pattern discovery: какие элементы чаще всего встречались вместе? Связанные задачи 8
  • 19. Идея: храним не всю информацию, а только то, что необходимо для ответа ∙ В случае вероятностного алгоритма (вариант): ∙ Храним и обновляем несколько значений x, вычисленных из увиденного потока ∙ E [f (x)] асимптотически равно оцениваемой величине ∙ Var [f (x)] должно быть мало Sketch 10
  • 21. Инициализация (для 𝜀 = 0.32) Выбрать большое простое число p, например 5247972723348490517 Выбрать три функции, например: h(x) = (3813295331020233847x + 2061310418014472126) mod p g1(x) = (4905134244493838961x + 339751972700966608) mod p mod 1000 g2(x) = (3462845419123084402x3+2920301559511116865x2+4398447080453503003x+ 1489413524815015911) mod p mod 10 Создать сжатый массив C из m = 10 элементов, равных 0. Вариант алгоритма 11
  • 22. Для каждого объекта x 1 r = lsb (h(x)) — количество нулей справа в бинарном представлении хеша + 1 2 i = g(x) 3 C[i] = max (C[i], r) Вариант алгоритма 11
  • 23. Получение результата 1 r = min(C) 2 T — количество элементов в C, которые больше r 3 Ответ: 2r+1log(1−T m ) log(1− 1 m ) Вариант алгоритма 11
  • 24. ∙ Будем рассматривать алгоритм, который: ∙ Отвечает с некоторой точностью 𝜀 F0,𝜀 = F0 · (1 ± 𝜀) ∙ Может ответить с большей ошибкой с вероятностью (1 − 𝛿) < 1 2 (𝜀, 𝛿)-аппроксимация Вероятностные алгоритмы 12
  • 25. ∙ Вероятность ошибки: 𝛿 < 1 2 ∙ Вероятность не допустить ошибку: 1 − 𝛿 > 1 2 ∙ При R повторах: ∙ Биноминальное распределение ∙ Нужно R 2 + 1 или больше верных ответов ∙ R∑︀ i=R 2 +1 (︀R i )︀ (1 − 𝛿)i 𝛿R−i Уменьшение вероятности ошибки 13
  • 26. h : U → {0, 1, 2, 3, . . . , m − 1} или h : U → {︂ 0, 1 m , 2 m , 3 m , . . . , 1 }︂ как правило, m |U| ∙ В современных реализациях потоковых алгоритмов, как правило: ∙ log m = 64 (64-битные хэш-функции). Хэш-функции 14
  • 27. ∙ Теоретически нам нужно, чтобы вероятность увидеть любой элемент была одинаковой ∙ На практике так не бывает ∙ Используем хэш-функции (теория): ∙ вероятность встретить определённый хэш 1 m ∙ даже если исходные объекты «скучкованны» Хэш-функции и случайные величины 15
  • 28. ∙ Абсолютно случайная хэш-функция: ∙ Для каждого элемента в U генерируем случайное число от 0 до m ∙ Храним n = |U| хэшей в массиве (векторе) ∙ O (n log m) места в памяти ∙ Часто нам нужно несколько хэш-функций... Память для хэш-функций 16
  • 29. ∙ На практике: ∙ используется быстрая детерминистическая функция от нескольких переменных ∙ фиксируются все переменные кроме одной ∙ нужно хранить только параметры функции ∙ как правило,O (log m) Память для хэш-функций 16
  • 36. 435839x + 117959 mod 567857 Хэш-функции 17
  • 43. ∙ При абсолютно случайной хэш-функции все значения не зависят друг от друга: Pr (h (x1) = c1, h (x2) = c2, . . . , h (xm) = cm) = 1 mm ∀ {︀ ci ∈ 0, m − 1 }︀ Семейства хэш-функций 18
  • 44. ∙ На практике нам достаточно независимости только для небольшого числа хэшей k ∙ Выбираем хэш-функцию случайно из некоторого семейства H ∙ например, для k = 2,(ax + b) mod p mod m, 0 < a < p, 0 b < p: Pr h∈H (h (x1) = c1 ∧ h (x2) = c2) = 1 m2 ∀x1, x2 ∈ U, ∀c1, c2 ∈ 0, m − 1 Семейства хэш-функций 18
  • 45. ∙ Для произвольного k h (x) = [︂(︂k−1∑︀ i=0 aixi )︂ mod p ]︂ mod m Pr (h (x1) = c1 ∧ h (x2) = c2 ∧ . . . ∧ h (xk) = ck) = 1 mk ∀x1 . . . xk ∈ U, ∀c1, . . . ck ∈ 0, m − 1 Семейства хэш-функций 18
  • 46. ∙ Вероятность верного ответа (1 − 𝛿) и память ∙ Вероятность и сложность (время выполнения) ∙ Точность 𝜀 и память: ∙ теоретически 𝜀 = 1√ M ∙ M — количество используемых хэш-функций Компромиссы 19
  • 47. ∙ В некоторый момент переключаем выполнение алгоритма с одного исполнителя (Алиса) к другому (Боб) ∙ Алиса при этом должна отправить Бобу сообщение. Дальше поток видит только Боб ∙ В конце Боб должен сказать, сколько было элементов в потоке с (𝜀, 𝛿) аппроксимацией ∙ Размер сообщения и есть потребление памяти Теоретическое потребление памяти 20
  • 48. ∙ Теоретический предел: O (︀ 1 𝜀2 + log n )︀ ∙ Наиболее распространённый на практике алгоритм: O (︀ 1 𝜀2 log log n )︀ n = |U| — количество возможных объектов (e.g. 264) log n — количество бит в бинарном представлении n (e.g. 64) log log n — количество бит, нужных для записи количества бит в n (e.g. 6) Теоретическое потребление памяти 20
  • 49. Сколько элементов в bloom-фильтре? 21
  • 50. Сколько элементов в bloom-фильтре? 21
  • 51. Сколько элементов в bloom-фильтре? 21
  • 52. Сколько элементов в bloom-фильтре? 21
  • 56. ∙ Сколько чисел из 0, m имеют ∙ k нулей в конце бинарного представления? ∙ k нулей в начале? ∙ k нулей или единиц подряд? Вероятность «редкой птицы» 23
  • 57. Pr (0 zeros) = 1 2 Pr (1 zero) = 1 2 Pr(2 zeros) = 1 4 Pr(k zeros) = 1 2k Вероятность «редкой птицы» 23
  • 58. Pr (0 zeros) = 1 2 Pr (1 zero) = 1 2 Pr(2 zeros) = 1 4 Pr(k zeros) = 1 2k ∙ А после N увиденных элементов? Вероятность «редкой птицы» 23
  • 59. Pr (0 zeros) = 1 2 Pr (1 zero) = 1 2 Pr(2 zeros) = 1 4 Pr(k zeros) = 1 2k ∙ А после N увиденных элементов? ∙ 1 − (︀ 1 − 1 2k )︀N Вероятность «редкой птицы» 23
  • 60. ∙ Итого: в «сломанном» bloom-фильтре примерно 2r 𝜑 элементов ∙ r — номер первого бита 1 справа ∙ 𝜑 — константа ∙ Нужно объединить результаты нескольких экспериментов (иначе будут ответы, кратные степеням 2) Вероятность «редкой птицы» 23
  • 61. 𝜑 = 2−1 2 e 𝛾 2 3 ∞∏︁ 𝜌=1 [︂ (4𝜌 + 1)(4𝜌 + 2) (4𝜌)(4𝜌 + 3) ]︂(−1) 𝜈(𝜌) ≈ 0.77351 𝜈(𝜌) — количество 1-бит в бинарном представлении 𝜌 𝛾 = − ∞´ 0 ln x ex dx — постоянная Эйлера Интересная константа 24
  • 62. ∙ Плохо: ответы, кратные степеням 2 ∙ Плохо: высокий разброс ошибки ∙ Хотим провести M независимых экспериментов, не дублируя поток ∙ Заводим M корзинок и раскладываем элементы в них при помощи ещё одной хэш-функции ∙ как при балансировке нагрузки ∙ одинаковые элементы всегда попадают в один «подпоток» Разделение потока 25
  • 63. ∙ NB: Первые элементы (K ∼ m) потока: ∙ NB: Сколько останется пустых корзинок? ∙ Pr (bi) = 1 m Pr (∼ bi) = (︀ 1 − 1 m )︀ ∙ Pr (∼ bi after K) = (︀ 1 − 1 m )︀K ∙ Pr (bi after K) = 1 − (︀ 1 − 1 m )︀K ∙ Все корзинки одинаковые: E (emty) = m (︁ 1 − (︀ 1 − 1 m )︀K )︁ Разделение потока 25
  • 64. ∙ применяем «сломанный bloom-фильтр» для каждой корзинки, считаем среднее ∙ Точность: 𝜀 = 0.78√ M ∙ Память: O (︀ 1 𝜀2 log n )︀ ∙ Заменив арифметическое среднее на гармоническое, получим 𝜀 = 1.02√ M Разделение потока 25
  • 65. ∙ Нам не нужно хранить сами значения в «регистрах» ∙ Достаточно индекса нужного бита ∙ вот тут и получается O (︀ 1 𝜀2 log log n )︀ Наблюдение 1 26
  • 66. ∙ В получившемся массиве почти все числа будут одинаковыми ∙ Можно хранить минимальное значение отдельно, а остальное — сжать ∙ Существуют компактные структуры данных с быстрым обновлением и запросами ∙ Память: O (sum (C)) (на практике: 3–4 1 𝜀2 ) ∙ E (#bucket ≈ log F0) = m (︁ 1 − (︀ 1 − 1 m )︀F0 )︁ ∙ остаётся выразить F0 Наблюдение 2 27
  • 67. ∙ Храним sketch за каждые несколько секунд ∙ При запросе объединяем все затронутые интервалы ∙ учитываем, что min хранится отдельно ∙ Запускаем последний шаг алгоритма ∙ Можем получить оценку не только за произвольный интервал времени, ∙ но и за объединение любых произвольных интервалов Я всё-таки хочу знать... 28
  • 68. Redis ∙ Специальная структура данных ∙ Специальные команды для этой структуры ∙ Удобно для работы с небольшим количеством множеств Реализации 29
  • 69. Clickhouse ∙ Умеет делать запросы с использованием вероятностных алгоритмов ∙ По-умолчанию uniq() использует вероятностный алгоритм ∙ Понятие состояния алгоритма и специальный тип данных Реализации 29
  • 71. 2r (r — количество 1 в конце слова x): 0 1 0 1 0 1 1 1 x 1 0 1 0 1 0 0 0 ∼ x 0 1 0 1 1 0 0 0 x + 1 0 0 0 0 1 0 0 0 ∼ x& (x + 1) = 2r Bit tricks 31
  • 72. x mod y (нам не нужен результат деления) ∙ x % p = ( x >> 61) + ( x & p) (если p = 261 − 1) ∙ ( ( uint128 ) x * ( uint128 )p ) >> 64 Bit tricks 31