2

java.util.BitSetはlong[]に支えられているため、最小サイズは64ビットです。それぞれがサイズ23のビットセットを必要とする大量(〜2M)のオブジェクトをキャッシュする必要があります。小さいサイズに対してよりスペース効率の良いビットセットの代替手段はありますか?たとえば、long[]ではなくbyte[]でバックアップされるBitSetタイプのデータ構造はありますか?これにより、23ビットを8バイトではなく3バイトに格納できます。

4

2 に答える 2

9

このjava.util.BitSetクラスは、より大きなビットセット用に設計されています。サイズ23のビットセットが必要な場合、ob 3バイトに基づくビットセットでさえ、メモリを大量に使用します。これは、任意のサイズの配列が、配列自体の追加の参照(4〜8バイトである可能性が高い)を使用するためです。

メモリに関して最も経済的な解決策はint、ビットセットの代わりにsを使用し、必要なビットセット操作の独自の実装を作成することです。ビットセットの操作は、ほとんどの場合ビット単位の操作からコピーされるため、問題なく実装できます。

boolean get(int mySet, int index) {
    return (mySet & (1<<index)) != 0;
}
int set(int mySet, int index) {
    return mySet | (1<<index);
}
int clear(int mySet, int index) {
    return mySet & (1<<index);
}

...等々。

于 2012-09-17T09:40:57.730 に答える
0

まず、長さ3のバイト配列は3バイトよりはるかに多くかかります。Javaのオブジェクトインスタンスには、BitSetを含むメモリオーバーヘッドがあります。

メモリ消費を低く抑えるには、ビットセットにint配列の要素を使用してみてください。このような要素はオブジェクトとして表現できないため、オブジェクト指向ではなく、プロシージャインターフェイスを開発する必要があります。必要なビットセットの操作を教えてください。より詳細なアドバイスを提供します。

于 2012-09-17T09:41:45.463 に答える