2010-10-13 5 views
4

J'ai sous-classé la classe BitSet pour ajouter des méthodes supplémentaires. L'un des s'appelle "fold". Il divise le BitSet en 2 moitiés et les "combine" avec un ou. (augmente la densité de l'information)Redimensionnement d'un bitSet Java

Cela fonctionne mais la taille (1024) du BitSet plié est toujours la taille d'origine.

code:

BitSet firstHalf; 
    BitSet secondHalf; 
    for(int i = nrOfTimes; i > 0; i--){ 
     firstHalf = this.get(0, this.size()/2); 
     secondHalf = this.get(this.size()/2, this.size()); 
     firstHalf.or(secondHalf); 
     this.clear(); 
     this.or(firstHalf); 
    } 

Il est probablement faisable de retourner une nouvelle BitSet de longueur désirée, mais seulement en créant un nouveau plus petit pour chaque itération mais vous devrez ré-assigner (myClass = myClass. plier()). Si vous vous couchez, la version originale ne présente aucun intérêt. L'idée est de gagner de la place (mémoire et DB).

Existe-t-il un moyen de réduire la taille du BitSet actuel? (un "truc" que je ne vois pas?)

Répondre

2

Je pense que c'est bon de faire myClass = myClass.fold(), vous n'avez pas à vous soucier de "gagner de la place".

Si l'objet ancien ne s'intéresse pas (par exemple, personne n'y fait référence) le garbage collector nettoiera la mémoire pour vous de toute façon. Il est bien optimisé pour ce genre de cas d'utilisation.

Ce motif est présent dans toutes les classes immuables de la bibliothèque Java. Prenez par exemple str = str.substring(i); ou bigInt = bigInt.multiply(BigInteger.TEN); etc.

+0

Merci. Alors le fera de cette façon. pensait probablement à l'optimisation au début. Ces BitSets représentent quelque chose et sont utilisés pour la recherche en mémoire. Code doit être capable de gérer plusieurs 100k facilement. (La création de ces BitSets prend un certain temps, d'où ils sont stockés dans un DB afin qu'ils puissent être rapidement rechargés). –

1

En effet vous avez raison, la méthode clear effacera tous les bits mais ne libèrera aucune mémoire interne utilisée pour maintenir les bits.

Pour ce que ça vaut: Si vous regardez le code source de BitSet. Les bits sont conservés dans un tableau interne appelé words. Le seul endroit où ce tableau est réduit est dans la méthode privée trimToSize(). Celui-ci n'est appelé qu'à partir de clone() et writeObject(), mais seulement si la taille est et non collante - c'est-à-dire si le BitSet n'a pas été créé en appelant le constructeur BitSet(int nbits).

Votre approche suggérée de créer un nouveau BitSet et de le réaffecter est parfaitement OK. La version originale sera récupérée de toute façon. La méthode modifiée pourrait ressembler à ceci:

public static BitSet fold(BitSet bs, int nrOfTimes) 
{ 
    BitSet temp; 
    while (nrOfTimes-- > 0) 
    { 
     temp = bs.get(0, bs.size()/2); 
     temp.or (bs.get(bs.size()/2, bs.size())); 
     bs.clear(); 
     bs.or(temp); 
    } 
    return temp; 
}