Redis HLL слишком много ложных срабатываний

Журнал Hyperlog - это вероятностный алгоритм. Согласно документу Redis HLL, мы можем получить 0,81% ошибок, но я получаю ошибки, такие как 17-20%.

Я думаю, что-то не так.. Это мой простой сценарий тестирования Perl. Есть ли какая-то ошибка

#!/usr/bin/perl -w                                                                                                                                                       
use Redis;
my $redis = Redis->new(server=>'192.168.50.166:6379') or die;
my $fp=0;
my $HLL="HLL";

$redis->del($HLL);
foreach my $i (1..10000) {
  my $s1 = $redis->pfadd($HLL,$i);
  if($s1 == 0){ 
    print "False positive on $i\n";
    $fp++;
  }
}
print "count of false positives $fp\n";

1 ответ

Решение

HyperLogLog используется для подсчета уникальных предметов. Он может рассчитывать большое количество предметов с небольшим объемом памяти. Тем не менее, возвращаемое количество не является точным, но округляется с standard error,

0,81% standard error, НЕ ложный положительный. Для вашего случая вы можете позвонить PFCOUNT HLL чтобы получить приблизительное количество уникальных предметов, которые вы положили в HyperLogLog, Возвращенное число должно быть в диапазоне [10000 * (1 - 0.81%), 10000 * (1 + 0.81%)],

PFADD возвращает 1, если расчетная мощность изменяется после выполнения команды. Возвращает 0, в противном случае. Это не имеет ничего общего с false positive,

Кажется, что вам нужен фильтр Блума, который может сказать вам, если элемент уже существует в наборе данных, с ложным срабатыванием. Вы можете реализовать Bloom Filter с Redis, конечно. И для этого должен быть какой-то проект с открытым исходным кодом.

Другие вопросы по тегам