10

Javaでは、長さが32のブール値(boolean [])の配列(> 10,000)をディスクに格納し、後で計算と比較のために再度読み取ります。

単一の配列の長さは32になるので、(32ビットマシンで)読み取りと書き込みを高速化するために整数値として格納するのが理にかなっているのではないかと思います。BitSetを使用してからintに変換することをお勧めしますか?または、intを忘れてbytesを使用しますか?

4

2 に答える 2

11

バイナリ ストレージの場合、読み取りにはintDataOutputStream( ) を使用します。DataInputStream

boolean 配列は、Java の内部では byte 配列または int 配列として格納されていると思います。そのため、オーバーヘッドを回避し、常に int エンコーディングを維持することを検討することをお勧めします。つまり、boolean[] をまったく使用しないでください。

代わりに、次のようなものがあります

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; 
  }
} 
于 2012-06-16T10:40:04.877 に答える
1

ブール値をパックするために圧縮を行うと、読み取りおよび書き込み時間が増加するという強い印象を受けます。(私の間違い、明らかに薬が足りませんでした)。関連するストレージに関しては、むしろ得られます。

BitSet は、ビジネス ロジック側で賢明な選択です。これは、int に変換できる long を内部的に格納します。ただし、BitSet はそのプライベートを表示しないほど慎重であるため、各ビット インデックスを順番に取得する必要があります。これは、バイトを直接使用するよりも、int に変換する利点がないと思うことを意味します。

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

于 2012-06-16T10:40:13.787 に答える