2012-06-16 9 views
10

Javaでは、長さ32のブール値(boolean [])の配列をディスクに格納しておき、後でそれらをさらに計算して比較するために読み込みたいと思います。Java:効率的にboolean [32]を格納しますか?

1つのアレイの長さは32なので、32ビットマシンで読み込みと書き込みを高速化するために整数値として格納するのが理にかなっているのだろうかと思います。 BitSetを使用してintに変換することをお勧めしますか?または、intとuseバイトを忘れてしまったでしょうか?

+1

あなたにとってより重要なもの:効率的なストレージ、または効率的な(つまり高速な)読み取り/書き込みですか? –

+0

私は速い読み取り/書き込みは、このアプリケーションではるかに重要だと思う – navige

+1

すべての配列を一度読み書きしたいのですか、特定の配列にランダムアクセスする必要がありますか? – Behe

答えて

11

バイナリ格納の場合は、intDataOutputStream(読み取りの場合はDataInputStream)を使用します。

ブール配列はJavaで内部的にバイト配列またはint配列として格納されていると思われますので、オーバーヘッドを避け、常にint []を使用しないでください。

代わりに、私はあなたがあなたのブール値をパックするために作成しようとしている任意の圧縮が読み取りを高め、時間を書き込むことを強く印象で午前

public class BooleanArray32 { 
    private int values; 

    public boolean get(int pos) { 
    return (values & (1 << pos)) != 0; 
    } 

    public void set(int pos, boolean value) { 
    int mask = 1 << pos; 
    values = (values & ~mask) | (value ? mask : 0); 
    } 

    public void write(DataOutputStream dos) throws IOException { 
    dos.writeInt(values); 
    } 

    public void read(DataInputStream dis) throws IOException { 
    values = dis.readInt(); 
    } 

    public int compare(BooleanArray32 b2) { 
    return countBits(b2.values & values); 
    } 

    // From http://graphics.stanford.edu/~seander/bithacks.html 
    // Disclaimer: I did not fully double check whether this works for Java's signed ints 
    public static int countBits(int v) { 
    v = v - ((v >>> 1) & 0x55555555);     // reuse input as temporary 
    v = (v & 0x33333333) + ((v >>> 2) & 0x33333333);  // temp 
    return ((v + (v >>> 4) & 0xF0F0F0F) * 0x1010101) >>> 24; 
    } 
} 
+0

+1、これはOPの必要条件のためのBitSetよりもはるかに優れています。 –

+0

完全に意味をなす!どうもありがとう! – navige

+0

セット内のエラーを修正し、スタティックヘルパーを下部に移動しました。 bitsInNibbleヘルパーのビット数を再確認することをお勧めします。あなたの仕事のすべてが期待どおりに機能しているかどうかをお知らせください。 –

1

のようなものを持っています。 (私の間違い、私は明らかに薬を紛失していた)。むしろ、関係するストレージの点では得られるでしょう。

BitSetは、ビジネスロジック側で賢明な選択肢です。内部的にlongを格納しています。これをintに変換できます。しかし、BitSetはあなたに秘密を見せないよう十分に慎重であるため、各ビットインデックスを順番に取得する必要があります。これは、単にバイトを直接使用するのではなく、intに変換することの利点がないと思います。

不必要なオーバーヘッドが発生しないため、Stefan Hausteinの独自のソリューション(BitSetを模倣するために必要に応じて拡張)は、ストレージ要件に適しています。

+0

最初の文は間違いありません。ストレージはバイト単位またはそれ以上の単位で構成されています。メモリアクセスや単純な計算よりもはるかに遅いオーダー。 –

+0

組織とメモリアクセスの比率については正しいですが、キャッシュも考慮する必要があります。私はそれを説明するために私の答えを修正します。 –

+1

ここにどのようにキャッシュが関わっているのか分かりません。これは圧縮に関するものではなく、バイト単位ではなく1ビット単位で1ビットを格納することに注意してください。 –

関連する問題