2017-06-07 4 views
1

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

+0

Y at-il des raisons pour lesquelles vous ne pouvez pas utiliser un filtre Bloom? Cela ressemble à l'utilisation exacte pour eux. – JacaByte

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