Scalable Bloom Filter
Продолжаю исследовать bloom filter. Простые фильтры многим хороши, но для моей задачи подсчёта уникальных посетителей они имеют ряд серьёзных недостатков. Самая главная проблема -- это фиксированный размер фильтра. В случае, если нельзя точно спрогнозировать, сколько посетителей может появиться, возникают две ситуации:
-- посетителей намного меньше заданного размера фильтра -- неэффективное использование памяти;
-- посетителей намного больше -- высокая погрешность подсчёта.
Технология Scalable Bloom Filter убивает сразу двух зайцев. Вкратце суть технологии такова:
Сначала создаётся фильтр минимально допустимого размера. В случае его заполнения создаётся ещё один фильтр большего размера и так далее. Накладные расходы: увеличение времени поиска и добавления ключей, перерасход памяти в случае плохо выбранных минимального размера фильтра и коэффициента (алгоритма?) увеличения размера. Поиск начинается от самого большого фильтра к самому малому. Если ни в одном из фильтров ключ не найден, производится добавление в наибольший фильтр.
Другая проблема состоит опять же в нерациональном использовании памяти, технология создания простого фильтра такова, что часть его ВСЕГДА остаётся пустой, даже если количество хранимых элементов точно известно. Теоретически эффективное использование памяти возможно при замене обычного фильтра на Compressed Bloom Filter.
Обзор технологий:
Building a Better Bloom Filter
Rank-Indexed Hashing
Scalable Bloom Filters
Пример реализации scalable bloom filter:
etrepum/python-bloomfilter
-- посетителей намного меньше заданного размера фильтра -- неэффективное использование памяти;
-- посетителей намного больше -- высокая погрешность подсчёта.
Технология Scalable Bloom Filter убивает сразу двух зайцев. Вкратце суть технологии такова:
Сначала создаётся фильтр минимально допустимого размера. В случае его заполнения создаётся ещё один фильтр большего размера и так далее. Накладные расходы: увеличение времени поиска и добавления ключей, перерасход памяти в случае плохо выбранных минимального размера фильтра и коэффициента (алгоритма?) увеличения размера. Поиск начинается от самого большого фильтра к самому малому. Если ни в одном из фильтров ключ не найден, производится добавление в наибольший фильтр.
Другая проблема состоит опять же в нерациональном использовании памяти, технология создания простого фильтра такова, что часть его ВСЕГДА остаётся пустой, даже если количество хранимых элементов точно известно. Теоретически эффективное использование памяти возможно при замене обычного фильтра на Compressed Bloom Filter.
Обзор технологий:
Building a Better Bloom Filter
Rank-Indexed Hashing
Scalable Bloom Filters
Пример реализации scalable bloom filter:
etrepum/python-bloomfilter