2017-03-12 1 views
1

J'ai un morceau de code qui prend en compte une quantité donnée de fonctionnalités, où chaque fonctionnalité est booléenne. Je suis à la recherche du moyen le plus efficace pour stocker un ensemble de ces fonctionnalités. Ma première pensée était d'essayer de les stocker comme BitSet. Mais ensuite, j'ai réalisé que cette implémentation est meant to be used to store numbers in bit format plutôt que de manipuler chaque bit, ce que je voudrais faire (voir l'effet de l'activation et de la désactivation de n'importe quelle fonction). J'ai alors pensé à utiliser un tableau booléen, mais apparemment le JVM uses much more memory for each Boolean element than the one bit a réellement besoin.Est-il possible de créer une séquence de bits efficace dans la mémoire de la JVM?

Je me suis donc posé la question suivante: Quelle est la manière la plus efficace de stocker un ensemble de bits que je voudrais traiter comme des éléments indépendants plutôt que comme les éléments constitutifs d'un nombre?

+0

Cette question ne concerne pas Java. –

+0

De combien de fonctionnalités parlons-nous qui vous inquiète de l'utilisation de la mémoire? –

+2

En outre, je ne comprends pas votre remarque "ma première pensée était d'essayer de les stocker en BitSet, mais j'ai réalisé que cette implémentation est destinée à stocker des nombres au format bit plutôt que de manipuler chaque bit". C'est ce que BitSets est pour: manipuler un grand nombre de bits de manière efficace. Individuel ou non. Pourquoi les BitSets se tromperaient-ils dans votre cas d'utilisation? –

Répondre

2

S'il vous plaît se référer à cette question: boolean[] vs. BitSet: Which is more efficient?

Selon la réponse de Peter Lawrey, booléen [] (non Boolean []) est votre chemin à parcourir puisque ses valeurs peuvent être manipulées et il faut seulement un octet de mémoire par bit à stocker. Considérons qu'il n'y a aucun moyen pour une application JVM de stocker un bit dans un seul bit de mémoire et de le manipuler directement (comme un tableau) car il a besoin d'un pointeur pour trouver l'adresse du bit et la plus petite unité adressable est octet.

Le site indique que vous avez mentionné déjà que le mutable BitSet est le même que le java.util.BitSet. Il n'y a rien que vous puissiez faire en Java que vous ne puissiez faire dans Scala. Mais puisque vous utilisez Scala, vous voulez probablement une implémentation sûre qui est probablement censée être multithread. Les types de données mutables ne sont pas adaptés pour cela. Par conséquent, je voudrais simplement utiliser un BitSet immuable et accepter le coût de la mémoire.

Cependant, bitsets ont leurs limites (découlant du nombre maximum de int). Si vous avez besoin de plus grandes tailles de données, vous pouvez utiliser LongBitSets, qui sont fondamentalement Carte < Long, BitSet >. Si vous avez besoin de plus d'espace, vous pouvez les imbriquer dans une autre carte Map < Long, LongBitSet >, mais dans ce cas, vous devez utiliser deux ou plusieurs identifiants (longs).

+2

boolean [] est le plus performant du point de vue des performances. BitSet est plus efficace pour l'utilisation de la mémoire pour les ensembles de données plus volumineux. –

+0

Est-ce que 'Boolean' est la valeur par défaut de Scala Boolean? Qu'est-ce que 'boolean' que? – shakedzy

+0

Boolean wraps booléen et offre plus de méthodes.Vérifiez ceci: http://stackoverflow.com/questions/3728616/boolean-vs-boolean-in-java –