0

Javaでプログラムを書いています。私のキーは書き込み可能で、値はビット文字列 0,1 です。ビット文字列のサイズは 1,000,000 (0 または 1 で構成されます) の可能性があります。占有するスペースが最も少なく、どのタイプのデータを使用する必要がありますか? ありがとう。

4

1 に答える 1

2

a を使用しjava.util.BitSetてビットを long にパックし、ある種の圧縮を受け取ることができます。前述の 1024 ビットの場合、8 バイトを占める 1024/64=16 long を使用してデータをエンコードできるため、合計で 128 バイトしか使用しません。

を実装するWritableには、同じ呼び出されたインターフェースを実装する必要があります。

public class BitSetWritable implements Writable {

  private BitSet set;

  public BitSetWritable() {
    // default constructor
  }

  public BitSetWritable(BitSet set) {
    this.set = set;
  }
  [...]
}

ここにいくつかの便利なコンストラクターを追加しました。既定のコンストラクトは、Hadoop のシリアル化メカニズムにとって必須であることに注意してください。

インターフェイスを実装した後、次の 2 つのメソッドを実装する必要があります:readFieldswrite:

 @Override
  public void write(DataOutput out) throws IOException {
    long[] longs = set.toLongArray();
    out.writeInt(longs.length);
    for (int i = 0; i < longs.length; i++) {
      out.writeLong(longs[i]);
    }
  }

  @Override
  public void readFields(DataInput in) throws IOException {
    long[] longs = new long[in.readInt()];
    for (int i = 0; i < longs.length; i++) {
      longs[i] = in.readLong();
    }

    set = BitSet.valueOf(longs);
  }

これは非常に簡単です。セットに割り当てられた long の数 (オーバーヘッドは 4 バイトのみ) を書き、次に bitset の long 値を書きます。読み返すときは、逆方向に同じことを行います。

直接コピーしたい場合は、完全なファイルとテストケースを github のライブラリに追加しました。

https://github.com/thomasjungblut/thomasjungblut-common/blob/master/src/de/jungblut/writable/BitSetWritable.java

https://github.com/thomasjungblut/thomasjungblut-common/blob/master/test/de/jungblut/writable/BitSetWritableTest.java

于 2013-08-23T16:50:41.103 に答える