Webアプリケーションは、正の整数のセットのペアを比較します。各セットには、210 000 000(28ビットに収まる)以下の一意の値のみがあります。各セットで最大5000000の値。
セットAとBを比較するには、「Aに固有」、「Bに固有」、「AとBに共通」の3つの結果セットが必要です。特定のタスクは、「セットSに番号Nが存在するか」という質問に答えることです。
これまでのところ、プロジェクトはLAMPスタックの下で共有ホスティングの限られたリソースで実行されています。私が思いついた手っ取り早い解決策は、より多くのリソースを持っているホスティングのMySQLに仕事をアウトソーシングすることでした。各セットの一時テーブル。番号の付いた列はプライマリインデックスのみです。まれに、セットがengine = Memoryに収まるほど小さいため、高速です。動作しますが、遅すぎます。
このようなセットをメモリ内に保持する方法を探しています。これは、内部の特定の番号を検索するタスクに効果的です。メモリフットプリントを可能な限り低く保つ。
各セットを2^28ビット(32 Mb)のビットマスクとしてコーディングするというアイデアを思いつきました。セットに存在する数=1ビットセット。5百万の数字=210百万から設定された5百万ビット。多くのゼロ==効果的に圧縮できますか?
自転車を発明しているようです。バイナリ圧縮のこの特定のケースに対する「よく知られた」解決策を教えてください。私はハフマン符号化について読みましたが、その焦点はサイズの縮小であるため、適切な解決策ではないようですが、私のタスクでは圧縮されたセットに対して多くの検索が必要です。
更新 ゴロムコーディングに関する記事と、ランレングスエンコーディングへのそのアプリケーションの例を見つけました。