現在、大量のビットマップ情報を格納するために、1 つの大きなビットセットを使用するか、64 ビットの符号なし long (uint_64) を多数使用するかを検討しています。この場合、ビットマップは数 GB のメモリ ページの現在のステータス (ダーティ/ダーティではない) を表し、何千ものエントリがあります。
私が実行している作業では、2 つのダーティ ページ ビットマップ間で OR 操作を実行するなど、ダーティ ページをクエリおよび更新できる必要があります。
明確にするために、次のことを実行します。
- ファイルからビットマップをインポートし、既存のビットマップでビット単位の OR 演算を実行する
- ハミング重みの計算 (ダーティ ページの数を表す 1 に設定されたビットの数をカウント)
- 少しリセット/クリアして、更新済み/クリーンとしてマークします
- ビットの現在のステータスをチェックして、クリーンかどうかを判断する
C++ ビットセットでビット単位の操作を実行し、ハミングの重みを簡単に計算するのは簡単なようです。ただし、ここには魔法はないと思います-CPUは、レジスタに格納できるバイト数に対してのみビット単位の操作を実行できます-したがって、ビットセットで使用されるルーチンは、私が実装するのと同じです。これはおそらくハミング重みにも当てはまります。
さらに、ビットマップ データをファイルからビットセットにインポートするのは見た目が悪いです。ここに示すように、ビットシフトを複数回実行する必要があります。使用するビットセットのサイズを考えると、これはパフォーマンスに悪影響を与えると思います。もちろん、代わりに多くの小さなビットセットを使用することもできると思いますが、これには利点がないかもしれません (おそらく実装の容易さ以外)。
いつものように、どんなアドバイスも歓迎します。ありがとう!