2010-06-29 13 views
5

Me gustaría saber cuál es el uso de la memoria de BitSet en el ejemplo Scala.For, si lo hago:BitSet uso de memoria en Scala

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

¿Cómo se compara con y matriz que contiene los números pares 0, 2,4,6,8?

¿Qué hay de escribir un número en binario:

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

¿Cómo se compara con el número 47?

Pregunto aquí sobre el uso de la memoria. Pero como una pregunta más abierta, si usted sabe, ¿cuáles son las ventajas/desventajas o usos de BitSet (WR a otros tipos de datos comunes).

Gracias,

+0

posible duplicado de [Boolean \ [\] frente a BitSet: ¿Cuál es más eficiente?] (Http://stackoverflow.com/questions/605226/boolean-vs-bitset-which-is-more-efficient) –

+3

Quizás debería proporcionarnos una declaración de nivel superior del problema que intenta resolver en lugar de tres preguntas variantes sobre las propiedades de la estructura de datos de muy bajo nivel. –

+0

Gracias Thomas, esa publicación me dio más información sobre BitSet. Todavía quiero saber si puedo ganar espacio representando otras estructuras mediante un BitSet. Supongo que todo será más claro si alguien puede aclarar cómo se implementa BitSet. Gracias, – Skuge

Respuesta

16

Usted puede mirar en el implementación de BitSet en Scala 2.8 aquí: scala.collection.mutable.BitSet.

Se implementa en base a una matriz de Longs. El tamaño de la matriz depende solo del número más alto almacenado en ella. Divida el número más alto almacenado en él por 64, redondeando hacia arriba, y tendrá el tamaño de la matriz. Cada elemento en la matriz consume 8 bytes.

Eso significa que dividir por 8 el mayor número almacenado en él, aproximadamente da como resultado el tamaño en bytes del BitSet. "Aproximadamente" debido a los gastos generales de administración de la memoria de la máquina virtual, ya que el puntero a la matriz también necesita algo de memoria y porque la matriz en sí tiene cierta sobrecarga.

El orden de inserción o el número real de elementos almacenados en el BitSet no tienen influencia en el tamaño de la memoria asignada.

Para los dos ejemplos que das, se requiere sólo un elemento de largo para almacenar los números, utilizando 8 bytes de memoria, ya que en ambos ejemplos, el número más alto es menos de 64.

Una matriz de INT, almacenar cinco números, consumiría 5 * 4 bytes = 20 bytes más gastos indirectos. Para almacenar n números necesita aproximadamente n * 4 bytes.

Así que está comparando (highestNumberStored/8) bytes con (countOfNumbersStored * 4) bytes.