代码之家  ›  专栏  ›  技术社区  ›  dmcer

Java中的非常紧凑Bitarray

  •  14
  • dmcer  · 技术社区  · 15 年前

    我正在寻找一种在Java中存储密集可变长度位数组的非常紧凑的方法。现在,我正在使用 BitSet ,但似乎平均使用 1.5×N位 存储空间的位向量大小 n . 通常,这不是问题,但在这种情况下,存储的位数组是应用程序内存占用的相当重要的一部分。所以,让它们变小确实有帮助。

    位集所需的空间似乎是由于用于支持数据结构的long数组在每次扩展以容纳更多位时都会增加一倍:

    // BitSet's resizing code
    private void ensureCapacity(int wordsRequired) {
      if (words.length < wordsRequired) {
        // Allocate larger of doubled size or required size
        int request = Math.max(2 * words.length, wordsRequired);
        words = Arrays.copyOf(words, request);
        sizeIsSticky = false;
      }
    }
    

    我可以编写自己的位集替代实现来更保守地扩展后端数据结构。但是,如果不需要的话,我真的不想复制标准类库中已经存在的功能。

    2 回复  |  直到 9 年前
        1
  •  20
  •   brianegge    15 年前

    如果您创建 BitSet 使用构造函数 BitSet(int nbits) 您可以指定容量。如果你猜的容量不对,再过一遍,它的大小就会翻一番。

    这个 位集合 班级确实有 trimToSize 方法,它是私有的,由WriteObject和Clone()调用。如果克隆或序列化对象,它会将其修剪到正确的长度(假设类通过EnsureCapacity方法过度扩展了它)。

        2
  •  5
  •   Daniel Lemire    9 年前

    您可能会从压缩的位集选项中受益。例如,请参见:

    https://github.com/lemire/javaewah

    http://roaringbitmap.org/