Article de reference

HyperLogLog

Terminologie Dans l'article original de Flajolet et al. et dans la littérature relative au problème du comptage des éléments distincts , le terme « cardinalité » désigne le nomb...

Terminologie

Dans l'article original de Flajolet et al. et dans la littérature relative au problème du comptage des éléments distincts , le terme « cardinalité » désigne le nombre d'éléments distincts dans un flux de données comportant des éléments répétés. Cependant, dans la théorie des multiensembles, ce terme fait référence à la somme des multiplicités de chaque élément d'un multiensemble. Par souci de cohérence avec les sources, cet article adopte la définition de Flajolet.

Algorithme

L'algorithme HyperLogLog repose sur le constat que la cardinalité d'un multiensemble de nombres aléatoires uniformément distribués peut être estimée en calculant le nombre maximal de zéros non significatifs dans la représentation binaire de chaque nombre de l'ensemble. Si ce nombre maximal est n , on estime le nombre d'éléments distincts de l'ensemble à 2<sup> n</sup> .

Dans l'algorithme HyperLogLog, une fonction de hachage est appliquée à chaque élément du multiensemble initial afin d'obtenir un multiensemble de nombres aléatoires uniformément distribués, de même cardinalité que le multiensemble initial. La cardinalité de cet ensemble aléatoire peut ensuite être estimée à l'aide de l'algorithme décrit précédemment.

L'estimation simple de la cardinalité obtenue à l'aide de l'algorithme ci-dessus présente l'inconvénient d'une variance élevée . Dans l'algorithme HyperLogLog, la variance est minimisée en divisant le multiensemble en de nombreux sous-ensembles, en calculant le nombre maximal de zéros non significatifs dans les nombres de chacun de ces sous-ensembles, et en utilisant une moyenne harmonique pour combiner ces estimations pour chaque sous-ensemble afin d'obtenir une estimation de la cardinalité de l'ensemble entier.

Opérations

L'HyperLogLog possède trois opérations principales : ajouter pour insérer un nouvel élément dans l'ensemble, compter pour obtenir sa cardinalité et fusionner pour obtenir l'union de deux ensembles. Certaines opérations dérivées peuvent être calculées à l'aide du principe d'inclusion-exclusion, comme la cardinalité de l'intersection ou la cardinalité de la différence entre deux HyperLogLogs, en combinant les opérations de fusion et de comptage.

Les données de l'HyperLogLog sont stockées dans un tableau compteurs (ou « registres ») qui sont initialisés à 0. Le tableau est appelé croquis HyperLogLog de S.

Ajouter

L'opération d'addition consiste à calculer le hachage des données d'entrée , en obtenant les estqui renvoie la position du 1 le plus à gauche, où la position la plus à gauche est 1 (autrement dit : nombre de zéros non significatifs plus 1). La nouvelle valeur du registre sera la valeur maximale entre la valeur actuelle du registre et

Compter

L'algorithme de comptage consiste à calculer la moyenne harmonique des du comté :

L'intuition est que , chaque sous-ensembleest introduit pour corriger un biais multiplicatif systématique présent dans

Considérations pratiques

La constante

La technique HyperLogLog, cependant, est biaisée pour les petites cardinalités inférieures à un seuil de

  1. Laisser
  2. Si
  3. Sinon, utilisez le comptage linéaire :

De plus, pour des cardinalités très élevées approchant la limite de la taille des registres ({\frac {2^{32}}{30 E>23230{ extstyle E>{\frac {2^{32}}{30}}}{\frac {2^{32}}{30 (pour les registres 32 bits), la cardinalité peut être estimée avec :

Avec les corrections ci-dessus pour les bornes inférieure et supérieure, l'erreur peut être estimée comme suit :

Fusionner

L'opération de fusion pour deux HLL (

Complexité

Pour analyser la complexité, le flux de données

L' opération d'addition dépend de la taille de la sortie de la fonction de hachage. Cette taille étant fixe, on peut considérer que le temps d'exécution de l'opération d'addition est

Les opérations de comptage et de fusion dépendent du nombre de registres Dans certaines implémentations ( Redis ) , le nombre de registres est fixe et le coût est considéré comme

HLL++

L'algorithme HyperLogLog++ propose plusieurs améliorations à l'algorithme HyperLogLog pour réduire les besoins en mémoire et augmenter la précision dans certaines plages de cardinalités :

  • Une fonction de hachage 64 bits est utilisée au lieu des 32 bits employés dans l'article original. Cela réduit les collisions de hachage pour les grandes cardinalités, permettant ainsi de supprimer la correction pour les grandes plages de valeurs.
  • Un biais est constaté pour les petits ensembles de valeurs lors du passage du comptage linéaire au comptage HLL. Une correction empirique de ce biais est proposée pour atténuer ce problème.
  • Une représentation clairsemée des registres est proposée pour réduire les besoins en mémoire pour les petites cardinalités, qui peut être transformée ultérieurement en une représentation dense si la cardinalité augmente.

Streaming HLL

Lorsque les données arrivent en flux unique, l' estimateur de probabilité inverse historique ou de martingale améliore significativement la précision de l'estimation HLL et utilise 36 % de mémoire en moins pour atteindre un niveau d'erreur donné. Cet estimateur est optimal pour toute estimation de comptage distinct approximative insensible aux doublons sur un flux unique.

Le scénario à flux unique entraîne également des variantes dans la construction du sketch HLL. HLL-TailCut+ utilise 45 % de mémoire en moins que le sketch HLL d'origine, mais au prix d'une dépendance à l'ordre d'insertion des données et de l'impossibilité de fusionner les sketches.

Pour en savoir plus

  • « Nouveaux algorithmes d'estimation de cardinalité pour les esquisses HyperLogLog » (PDF) .