J'ai un ensemble de 150M entiers en Python que j'aimerais utiliser pour filtrer les données. Chacun de ces entiers est un "ID utilisateur" stocké dans un format 32 bits et je veux supprimer tous les utilisateurs qui sont dans l'ensemble. L'ensemble est trop grand car j'ai besoin de le transférer à beaucoup de travailleurs sur un cluster, où chaque travailleur a une quantité limitée de mémoire. Vu que j'ai seulement besoin d'une valeur binaire (l'utilisateur est mis/pas en jeu), il semble possible de le faire en utilisant un bitarray. Les ID commencent à 0 et se terminent à environ 300 M (c'est-à-dire que la moitié des utilisateurs se trouvent dans l'ensemble). Le bitarray entier doit être défini sur False (c'est-à-dire 0), à l'exception des emplacements contenus dans l'ensemble des ints. J'ai regardé the bitstring
package et the bitarray
package, mais je ne sais pas quel est le meilleur pour mon but et comment je devrais y aller. Quelqu'un peut-il donner quelques conseils ou un petit exemple de la façon de convertir mon ensemble en bitarray et ensuite faire une recherche en utilisant?Conversion d'un ensemble d'entiers en bitarray pour une recherche efficace en mémoire
1
A
Répondre
1
Personnellement je préfère bitarray
et en supposant que vous avez un tel ensemble (seulement plus):
# Just some random set
myset = {5, 27, 142, 824}
Ensuite, vous pouvez utiliser bitarray
pour créer un bitarray
(de longueur appropriée) ne contenant que False
:
from bitarray import bitarray
ba = bitarray(1000) # length 1000
ba.setall(False) # contains only zeros
Cependant, il n'existe aucun support natif pour en créer un à partir d'un set
, vous aurez donc besoin d'une boucle pour définir les valeurs appropriées:
for item in myset:
ba[item] = True
Et vous pouvez vérifier si la valeur par l'indexation:
print(ba[5]) # True
print(ba[6]) # False
print(ba[27]) # True
Y at-il des raisons pour lesquelles vous ne pouvez pas utiliser un filtre Bloom? Cela ressemble à l'utilisation exacte pour eux. – JacaByte