Scala中的BitSet内存使用情况

Sku*_*uge 5 memory performance scala bitsets bitset

我想知道Scala中BitSet的内存使用情况.例如,如果我这样做:

  var bitArray:BitSet=new BitSet(10)
  bitArray.add(0)
  bitArray.add(2)
  bitArray.add(4)
  bitArray.add(6)
  bitArray.add(8)
Run Code Online (Sandbox Code Playgroud)

与包含偶数0,2,4,6,8的数组相比如何?

如何用二进制编写数字:

  var bitArray:BitSet=new BitSet(32)
  bitArray.add(5)
  bitArray.add(3)
  bitArray.add(2)
  bitArray.add(1)
  bitArray.add(0)
Run Code Online (Sandbox Code Playgroud)

这与47号相比如何?

我在这里问内存使用情况.但作为一个更开放的问题,如果你知道,BitSet(WR对其他常见数据类型)的优点/缺点或用途是什么.

谢谢,

Rue*_*ler 16

您可以在这里查看Scala 2.8中BitSet的实现:scala.collection.mutable.BitSet.

它基于Longs数组实现.数组的大小仅取决于存储在其中的最大数字.将存储在其中的最大数字除以64,向上舍入,并且您具有数组的大小.数组中的每个元素占用8个字节.

这意味着除以8存储在其中的最大数字,大致产生BitSet的字节大小."粗略"是因为虚拟机内存管理开销,因为指向数组的指针也需要一些内存,因为数组本身有一些开销.

插入顺序或存储在BitSet中的实际元素数量不会影响分配的内存大小.

对于您给出的两个示例,使用8个字节的内存只需要一个Long元素来存储数字,因为在两个示例中,最高数字小于64.

存储任意五个数字的Ints数组将消耗5*4个字节= 20个字节加上开销.要存储n个数字,您需要大约n*4个字节.

因此,您将(highestNumberStored/8)字节与(countOfNumbersStored*4)字节进行比较.