3

の独自の実装を作成しHyperLogLog algorithmました。これはうまく機能しますが、多くの (約 10k ~ 100k) の HLL 構造を取得してマージする必要がある場合があります。

それぞれをビット文字列として保存するため、最初に各ビット文字列をバケットに変換する必要があります。HLLがたくさんあるので、私が望むよりも時間がかかります.

現在、実行時間の約 80% で、HLL ごとに次のコード行が 1 回呼び出されます。

my @buckets = map { oct '0b'.$_ } unpack('(a5)1024', $bitstring);

より速くする方法はありますか?

HyperLogLog の定義を後にすると、タスクは次のように説明できます: $bitstring1024 個の 5 ビット カウンターで構成されている場合 (したがって、各カウンターは最大 32 個の値を持つことができます)、1024 個の整数の配列に変換する必要があります。

4

1 に答える 1

6

aは、ゼロで埋められた任意のバイナリ データを示します。ここでは、そのデータを ASCII テキストとして扱いますが、含めることができるのは10! a5これは、5 バイトを使用することになるため、非効率的です。最も簡単で効率的な解決策は、各カウンターに 8 ビットの数値を格納することですmy @buckets = unpack 'C1024', $bitstring

カウンターごとに 5 ビットだけを格納したい場合は、非常に手間がかかるため、メモリをほとんど節約できません。往復変換には、次のような非常識なものを使用する必要があります。

my $bitstring = pack "(b5)1024", map { sprintf "%b", $_ } @buckets;
@buckets = map { oct "0b$_" } unpack "(b5)1024", $bitstring;
于 2014-05-15T19:21:58.857 に答える