2017-03-21 2 views
1

HyperLOG log ein probablistic Algorithmus Nach dem redis HLL Dokument ist, könnten wir 0,81% der Fehler erhalten, aber ich bekomme Fehler wie 17-20%redis HLL zu viele Fehlalarme

Ich denke, es ist etwas falsch. Dies ist mein einfaches Perl-Testskript. Gibt es einen Fehler

#!/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

Ist Hyperloglog nicht über das Zählen von einzigartigen Dingen, und Sie zählen immer und immer wieder dasselbe? – Sobrique

Antwort

3

HyperLogLog zum Zählen Unikate verwendet. Es kann eine große Anzahl von Elementen mit wenig Speicher zählen. Die zurückgegebene Kardinalität ist jedoch NICHT exakt, sondern angenähert mit einer standard error.

0,81% ist die standard error, NICHT die falsche positive. Für Ihre Instanz können Sie PFCOUNT HLL anrufen, um die ungefähre Anzahl der eindeutigen Elemente zu erhalten, die Sie in die HyperLogLog eingeben. Die zurückgegebene Nummer sollte im Bereich von [10000 * (1 - 0.81%), 10000 * (1 + 0.81%)] liegen.

PFADD gibt 1 zurück, wenn die geschätzte Kardinalität nach der Ausführung des Befehls geändert wird. Andernfalls wird 0 zurückgegeben. Es hat nichts mit false positive zu tun.

Es scheint, dass Sie eine Bloom Filter benötigen, die Ihnen sagen kann, ob ein Element bereits in einem Datensatz vorhanden ist, mit false positive. Sie können natürlich eine Bloom Filter mit Redis implementieren. Und dafür sollte es ein Open-Source-Projekt geben.

+0

Ja, ich brauche einen Bloom Filter, aber als Server. Weil ich mehrere haben – Ram

+0

Ja, ich brauche einen Bloom Filter, aber als Server. Weil ich mehrere Anwendungen von verschiedenen Servern habe. Alle müssen prüfen, ob ein bestimmtes Element in einem Set existiert oder nicht. Dies muss sehr effizient sein und die Sets werden für 2-3 Monate persistent sein. Gibt es einen fertigen Bloom-Filter-Server, den ich verwenden kann – Ram

+1

@Ram Wie ich erwähnt habe, können Sie Redis als Backend-Server verwenden, um den Bloom-Filter zu implementieren. Sie können nach Open-Source-Projekten suchen. Außerdem ist es nicht schwierig, selbst ein Skript mit Lua-Skripten und den Befehlen 'GETBIT' und' SETBIT' zu implementieren. –