【问题标题】:BitSet memory usage in ScalaScala 中的 BitSet 内存使用情况
【发布时间】:2010-06-29 12:57:35
【问题描述】:

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

  var bitArray:BitSet=new BitSet(10)
  bitArray.add(0)
  bitArray.add(2)
  bitArray.add(4)
  bitArray.add(6)
  bitArray.add(8)

与包含偶数 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)

这与数字 47 相比如何?

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

谢谢,

【问题讨论】:

  • 也许你应该给我们一个关于你试图解决的问题的更高级的陈述,而不是关于非常低级的数据结构属性的三个变体问题。
  • 感谢 Thomas,这篇文章让我对 BitSet 有了更多的了解。我仍然想知道是否可以通过用 BitSet 表示其他结构来获得空间。我想如果有人能阐明 BitSet 是如何实现的,一切都会更清楚。谢谢,
  • Thomas:这里的上下文是 Scala,它提供了自己的BitSet,尽管Array[Boolean] 与Java 中的Boolean[] 相同。密切相关,但不完全相同。
  • @Daniel 很有趣。如果它支持压缩位集......但是两个实现都有相同的想法,您可以阅读 Java 或 Scala lib 代码,它是相同的。

标签: memory scala performance bitset bitsets


【解决方案1】:

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

它是基于一个 Long 数组实现的。数组的大小仅取决于其中存储的最大数。将其中存储的最高数字除以 64,向上取整,就得到了数组的大小。数组中的每个元素占用 8 个字节。

这意味着将其中存储的最大数字除以 8,大致得出 BitSet 的大小(以字节为单位)。 “大致”是因为虚拟机内存管理开销,因为指向数组的指针也需要一些内存,而且数组本身也有一些开销。

插入顺序或存储在 BitSet 中的实际元素数量对分配的内存大小没有影响。

对于您给出的两个示例,只需要一个 Long-element 来存储数字,使用 8 个字节的内存,因为在两个示例中,最大数字都小于 64。

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

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

【讨论】:

    猜你喜欢
    • 2012-01-23
    • 2012-01-26
    • 1970-01-01
    • 2010-10-19
    • 2014-07-31
    • 2011-07-23
    • 2012-11-10
    • 2014-07-11
    • 2015-04-11
    相关资源
    最近更新 更多