ГоловнаСтаттіHyperLogLog: Підрахунок мільярдів унікальних елементів за кілька кілобайт

HyperLogLog: Підрахунок мільярдів унікальних елементів за кілька кілобайт

Уявіть, намагаючись порахувати скільки унікальних відвідувачів потрапляє на веб-сайт з мільярдом щоденних запитів, не зберігаючи жодного ID. Звучить неможливо, але HyperLogLog робить це саме так, використовуючи структуру даних меншу за один електронний лист. Він обмінюється ідеальною точністю на мініатюрний, фіксований розмір пам'яті, перетворюючи проблему, яка потребувала б гігабайтів зберігання, на ту, що поміщається в кілька кілобайт. Ключем є розумний шлях до ймовірності: рідкісні закономірності в випадково виглядаючих хеш-значеннях тихо розкривають, скільки унікальних речей їх створило. Цей симулятор дозволяє живити елементами, спостерігати, як хеші потрапляють у ємність, і бачити, як оцінка збігається з фактичним підрахунком в режимі реального часу.

mysimulator teamОновлено — червень 2026≈ 8 хв читання▶ Відкрити симуляцію

Чому точна ліч не працює на великих мащабах

Найпростіший спосіб порахувати унікальні елементи — це запам’ятовувати кожен елемент, який ви бачите, зазвичай у хеш-множині, і перевіряти нові елементи проти нього. Це працює чудово для невеликих наборів даних, але дуже погано масштабується. Щоб точно порахувати мільярд унікальних ID користувачів, вам потрібно зберігати приблизно мільярд записів у пам’яті, що може легко означати кілька гігабайт оперативної пам’яті. Помножте це на тисячі показників, таких як унікальна кількість відвідувачів сторінки, на день, за країною, і точна ліч стає неможливою з фінансової та операційної точки зору. Основна проблема полягає в тому, що точне підрахунок кардинальності вимагає пам’яті, пропорційної кількості унікальних елементів, незалежно від того, наскільки розумно ви їх зберігаєте. Реальні системи, такі як платформи аналітики, рекламні мережі та бази даних, часто потребують відстеження унікальних рахунків для мільйонів окремих ключів одночасно, кожен з яких може містити мільярди елементів. Зберігання повної множини для кожного з них просто не поміщається в пам’ять або бюджет. Ця прогалина була заповнена алгоритмами оцінки кардинальності на основі ймовірностей. Приймаючи невелику, статистично обмежену кількість помилок, зазвичай кілька відсотків, алгоритми, такі як HyperLogLog, зменшують вимоги до пам’яті з гігабайтів до кілобайт, що є зменшенням на кілька порядків величини. Цей компроміс — незначна помилка за значні заощадження пам’яті, робить практичним підрахунок в інтернеті.

Основна ідея: Початкові нулі як підказка

HyperLogLog's фундаментальна ідея починається з хешування. Кожен елемент, який ви рахуєте, проходить через функцію хешування, яка генерує вигляд випадкових бітів. Оскільки хороша хеш-функція рівномірно розподіляє вихідні дані, кожен біт у цій послідовності з однаковою ймовірністю є 0 або 1, незалежно один від одного. Тепер розглянемо кількість початкових нулів у хеші, тобто скільки нулів з'являється перед першим 1. Ймовірність того, що окремий випадковий хеш починатиметься з однієї початкової цифри нуль, становить половину. Ймовірність того, що він почнеться з двох початкових цифр нуль, становить чверть, оскільки перші два біти повинні бути нулями. Послідовність з k початкових нулів має ймовірність однієї на дві до степеня k. Це означає, що спостереження довгої послідовності початкових нулів в будь-якому окремому хеші рідкісне. Але якщо ви хешуєте багато різних елементів і відстежуєте найдовшу кількість початкових нульових цифр, спостерігану серед усіх них, цей максимум зростає, коли ви додаєте більше різних елементів. Інтуїтивно, якщо максимальна довжина послідовності початкових нулів, яку ви бачили, становить 10 початкових нулів, це подія з ймовірністю однієї на тисячу двісті чотири, тому вам, ймовірно, потрібно було спробувати приблизно тисячу різних елементів, перш ніж на неї наткнутися. Це одне число, максимальна довжина послідовності початкових нулів, стає приблизним, але реальним статистичним оцінником того, скільки різних елементів було захешовано.

Разделение на Отсеки: Почему Один Счетчик Не Достаточен

Едичный счетчик максимальной длины ведущих нулей — это шумный оценочный показатель. Одна удачная или неудачная хеш-функция может сбить всю оценку с толку на большой величину, поскольку оценка экспоненциально растет с длиной хода. HyperLogLog действительно решает эту проблему путем разделения входящего пространства хешей на множество независимых отсеков, часто называемых регистрами, обычно между несколькими сотнями и тысячами из них. Несколько битов из каждого хеша, например, первые несколько бит, определяют, в какой отсек направляется хеш этой записи, а остальные биты используются для вычисления длины ведущих нулей в этом отсеке. Каждый отсек независимо отслеживает только свою максимальную длину хода. Вместо того чтобы полагаться на один шумный номер, у вас теперь есть сотни или тысячи независимых шумных оценок. Усреднение по многим независимым шумным сигналами значительно снижает дисперсию, что является общим и мощным статистическим принципом. HyperLogLog специально использует гармоническое среднее вместо простого арифметического среднего для объединения оценок по отсекам, поскольку гармонические средние гораздо менее чувствительны к редким большим значениям выбросов, которые здесь имеют большое значение, поскольку оценки длины хода экспоненциально растут. Окончательная оценка кардинальности выводится из этого гармонически усредненного значения, умноженного на константу исправления смещения, настроенную для количества используемых отсеков.

Точність проти Пам'яті: Незвичайна Умова

Практична вигода від підходу з кошиками та гармонійною середньою є вражаючою. З лише тисячею реєстром, кожен з яких потребує лише кількох біт для зберігання невеликого значення довжини послідовності, HyperLogLog може оцінювати кардінальність множинного набору з похибкою стандартного відхилення приблизно 2%, незалежно від того, чи справжній лік має тисячу або мільярд. Загальне використання пам'яті для такої точності зазвичай становить близько 1,5 кілобайтів, іноді вказано як потребує приблизно m разів по 6 біт, де m - кількість реєстрів, наприклад, 16384 реєстри використовуються приблизно 12 кілобайтами для дуже точних конфігурацій. Порівняйте це з точним підрахунком, де відстеження мільярда унікальних 64-бітових ідентифікаторів з хеш-набором може вимагати багато гігабайт, якщо врахувати накладні витрати хеш-таблиці. Це зменшення використання пам'яті в кілька порядків величини для невеликого, передбачуваного та математично обмеженого відхилення. Важливо, що ця похибка не зростає з ростом даних. Стандартне відхилення залишається приблизно постійним зі збільшенням кардінальності, що робить HyperLogLog унікально придатним для відстеження великих, постійно зростаючих наборів даних. Ви можете налаштувати компроміс, вибираючи більше або менше реєстрів: більше реєстрів означає нижчу похибку, але більше пам'яті, що відповідає добре відомій математичній залежності між кількістю реєстрів та очікуваним стандартним відхиленням.

Практичне застосування: від Redis до веб-аналітики

HyperLogLog не є просто академічною цікавістю, він вбудований у виробничі системи, які щодня обробляють величезні масштаби. Redis, популярний ін-меморі банк даних, пропонує нативну підтримку HyperLogLog через команди, такі як PFADD для додавання елементів і PFCOUNT для отримання оцінки кардинальності, все підтримується структурою даних, яку Redis обмежує приблизно до 12 кілобайтів незалежно від того, скільки мільярдів елементів було додано. Інженерні команди використовують це для підрахунку унікальних відвідувачів веб-сайту, унікальних запитів пошуку, що подаються в пошукову систему, унікальних IP-адрес, які досягають API, або унікальних продуктів, переглянутих у каталозі електронної комерції, без вибухового споживання пам'яті, яке б вимагав точний підрахунок. Великі аналітичні платформи та бази даних, включаючи системи, побудовані великими пошуковими системами та соціальними мережами, використовують HyperLogLog або близькі варіанти внутрішньо з цієї причини: швидкі та дешеві приблизні відповіді часто є набагато ціннішими, ніж точні відповіді, які занадто повільні або занадто дорогі для обчислення. Ще одна зручна властивість полягає в тому, що структури HyperLogLog з різних шарів або часових вікон можуть бути об'єднані разом, дозволяючи обчислювати унікальні підрахунки на об'єднаних наборах даних без повторного сканування оригінальних даних, що природно вписується в розподілені та потокові архітектури.

Frequently asked questions

Чи завжди точний орієнтовний підрахунок від HyperLogLog?

Ні, це ймовірнісний орієнтовний підрахунок із обмеженою стандартною похибкою, зазвичай близько 2% з типовими конфігураціями. Він рідко буде абсолютно точним, але залишається в передбачуваному статистичному діапазоні від справжнього значення, і так далі.

Чому не використовувати звичайний хеш-набір для підрахунку унікальних елементів?

Хеш-набір зберігає кожен унікальний елемент, тому його використання пам'яті лінійно зростає із кількістю унікальних елементів і може досягати гігабайтів для наборів даних з мільярдами записів. HyperLogLog використовує фіксований, невеликий обсяг пам’яті незалежно від кардинальності.

Що відбувається, якщо два різні елементи генерують однакові хеші?

Хеш-конфлікти надзвичайно рідкі з хорошою хеш-функцією та великим розміром вихідного хешу, і математика HyperLogLog вже враховує невеликий статистичний шум, який це вносить, тому це не суттєво впливає на точність.

Чи можна об'єднувати підрахунки HyperLogLog з кількох джерел?

Так, це одна з його найкорисніших властивостей. Ви можете об’єднати дві структури HyperLogLog, взявши елементне максимальне значення їхніх реєстрів, що призводить до валідного структур для об’єднання обох початкових наборів без необхідності в необроблених даних.

Чому HyperLogLog використовує гармонійний середній замість простого середнього?

Орієнтовні значення довжини пробігу зростають експоненціально, тому одне незвичайне велике значення у простому середньому може значно спотворити результат. Гармонійний середній набагато менш чутливий до таких викидів і забезпечує більш стабільну загальну оцінку.

Спробуйте наживо

Усе, що вище, працює прямо у вашому браузері — відкрийте HyperLogLog: Counting Billions of Unique Items in a Few Kilobytes і змінюйте параметри під час роботи. Нічого не встановлюється, нічого не завантажується на сервер, уся модель живе в одній вкладці.

▶ Відкрити симуляцію HyperLogLog: Counting Billions of Unique Items in a Few Kilobytes

Що ви знайшли?

Додати кроки відтворення (опційно)