2012-09-23 2 views
0

J'écris un script python qui fait diverses permutations de caractères. Finalement, le script va planter avec une erreur de mémoire insuffisante en fonction de la profondeur que je veux pour la permutation.Python, mémoire insuffisante lors de l'itération sur de très grands nombres

Je pensais initialement que la solution aurait vidé la liste et redémarré, mais de cette façon, j'obtiendrais une erreur d'index hors limites.

Ceci est mon courant mis en place:

for j in range(0, csetlen): 
    getJ = None 
    for i in range(0, char_set_len): 
     getJ = word_list[j] + char_set[i] 
     word_list.append(getJ) 

    csetlen = csetlen - j 
    del word_list[j-1:] 
    word_list.append(getJ) 
    j=0 

Fondamentalement, csetlen peut être un très grand nombre (de plus de 100.000.000). Bien sûr, je n'ai pas assez de RAM pour cela; donc j'essaie de savoir comment réduire la liste dans la boucle externe for. Comment fait-on cela gracieusement?

L'erreur de mémoire concerne word_list. Actuellement, je stocke des millions de permutations différentes; Je dois être capable de "recycler" certaines des anciennes valeurs de la liste. Comment fait-on cela sur une liste python?

Répondre

1

Ce que vous voulez est un itérateur qui génère les valeurs sur demande (et ne les stocke pas en mémoire):

from itertools import product 
getJ_iterator = product(wordlist[:csetlen], char_set[:char_set_len]) 

Cela équivaut à la fonction générateur suivant:

def getJ_gen(first_list, second_list): 
    for i in first_list: 
     for j in second_list: 
      yield (i, j) 

getJ_iterator = getJ_gen(wordlist[:csetlen], char_set[:char_set_len]) 

vous itérer sur l'objet comme ceci:

for item in getJ_iterator: 
    #do stuff 

Notez que item dans ce cas serait un tuple de la forme (word, char).

+0

@icktoofay: Doh! Oui je l'ai fait. : P –

Questions connexes