5

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 を含む配列と比べてどうですか?

数値を 2 進数で書くとどうなりますか。

  var bitArray:BitSet=new BitSet(32)
  bitArray.add(5)
  bitArray.add(3)
  bitArray.add(2)
  bitArray.add(1)
  bitArray.add(0)

それは47という数字と比べてどうですか?

ここでメモリ使用量を尋ねています。しかし、よりオープンな質問として、知っていれば、BitSet の利点/欠点または使用法は何ですか (他の一般的なデータ型への WR)。

ありがとう、

4

1 に答える 1

16

Scala 2.8でのBitSetの実装は、scala.collection.mutable.BitSetで確認できます。

Longsの配列に基づいて実装されます。配列のサイズは、配列に格納されている最大数にのみ依存します。格納されている最大数を64で除算し、切り上げます。配列のサイズがわかります。配列内の各要素は8バイトを消費します。

つまり、格納されている最大数を8で割ると、ビットセットのバイト単位のサイズが大まかに得られます。仮想マシンのメモリ管理のオーバーヘッド、アレイへのポインタにもメモリが必要であり、アレイ自体にオーバーヘッドがあるため、「おおよそ」です。

挿入の順序またはビットセットに格納されている実際の要素数は、割り当てられたメモリのサイズに影響を与えません。

与えた2つの例では、8バイトのメモリを使用して、数値を格納するために必要なLong要素は1つだけです。どちらの例でも、最大数は64未満です。

5つの数値を格納するIntの配列は、5*4バイト=20バイトとオーバーヘッドを消費します。n個の数値を格納するには、およそn*4バイトが必要です。

したがって、(highestNumberStored / 8)バイトを(countOfNumbersStored * 4)バイトと比較しています。

于 2010-06-29T16:04:28.763 に答える