2010-01-19 10 views
14

Estoy buscando una manera muy compacta de almacenar una bitarra de longitud variable densa en Java. En este momento, estoy usando BitSet, pero parece utilizar en promedio 1.5 * n bits de espacio de almacenamiento para un vector de bits de tamaño n. Normalmente, esto no es un problema, pero en este caso los bitarrays que se almacenan son una parte bastante importante de la memoria de la aplicación. Por lo tanto, realmente ayudaría a que sean un poco más pequeños.Bitarray muy compacto en Java

El espacio requerido por BitSet parece ser debido al hecho de que la matriz de largos utilizados para respaldar la estructura de datos tiende a duplicarse cada vez que se expande para contener más bits:

// 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; 
    } 
} 

podría escribir mi propia implementación alternativa de BitSet que escala la estructura de datos de back-end de manera más conservadora. Pero, realmente no me gustaría duplicar la funcionalidad que ya está en las bibliotecas de clases estándar si no es necesario.

+1

que tendría un tiempo difícil imaginar esto sería en la biblioteca estándar de Java. No es para lo que está diseñado. Aunque apuesto a que podrías encontrar una biblioteca de terceros. – Pace

+0

Creo que en su caso la implementación personalizada sería una mejor opción. – cx0der

Respuesta

20

Si crea el BitSet utilizando el constructor BitSet(int nbits), puede especificar la capacidad. Si adivina la capacidad incorrecta y la revisa, duplicará el tamaño.

La clase BitSet tiene un método trimToSize que es privado, y es llamado por writeObject y clone(). Si clonas tu objeto o lo serializas, lo recortará a la longitud correcta (suponiendo que la clase lo haya expandido mediante el método ensureCapacity).

+8

Sí. Tenga en cuenta que en realidad no necesita usar la versión copiada. El original está recortado (!). –

+0

Eso es bastante inteligente. ¡Gracias! – dmcer

+0

Al menos en [fuente de openjd] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/util/BitSet.java#1085) en GrepCode , el original no se recorta en el caso donde especificó un tamaño inicial y la matriz no ha necesitado crecer. – user2357112

Cuestiones relacionadas