【问题标题】:Python, out of memory when iterating over very large numbersPython,迭代非常大的数字时内存不足
【发布时间】:2012-09-14 23:59:14
【问题描述】:

我正在编写一个 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 列表执行此操作?

【问题讨论】:

    标签: python list memory


    【解决方案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
    

    请注意,在这种情况下,item 将是 (word, char) 形式的元组。

    【讨论】:

    • @icktoofay:哇!是的,我做到了。 :P
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多