2012-09-23 69 views
0

我在寫一個python腳本,它可以做各種各樣的字符排列。最終,腳本會因內存不足而崩潰,具體取決於我想要進行排列的深度。python,遍歷非常大的數字時內存不足

我最初以爲解決方案將清空列表並重新啓動,但這樣做,我得到索引超出界限錯誤。

這是我目前的設置:

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 

基本上,csetlen可以是一個非常大的數字(過量100,000,000)。當然,我沒有足夠的內存,所以我試圖找出如何縮小外部for循環中的列表。如何優雅地做這件事?

內存錯誤與word_list有關。目前,我正在存儲數百萬種不同的排列;我需要能夠「回收」一些舊的列表值。如何做到這一點的Python列表?

回答

1

你想要的是按需生成的值(並且不將它們存儲在內存中)的迭代:

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

這等同於以下生成功能:

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]) 

您可以像這樣遍歷對象:

for item in getJ_iterator: 
    #do stuff 

請注意在這種情況下,210將是一個形式爲(word, char)的元組。

+0

@icktoofay:Doh!是的,我做到了。 :P –