Python 列表占用了13千兆内存和1.27亿条记录:如何?

Python 列表占用了13千兆内存和1.27亿条记录:如何?,python,list,Python,List,我正在经历一个涉及快速处理和大数据的编程挑战。我试图生成一个数字范围内可能的排列列表,然后搜索它们 代码: 问题是,当A为6,B为25时,我的程序速度大大降低,占用了大量RAM。大约有13场演出。列表的长度约为127 mil,每个对象的长度为6。这将使内存的使用量达到750兆左右,而不是13兆。发生什么事了 编辑:数据只是数字。所以[[0,1,2,3,4,5],[0,1,2,3,4,6],…]列表或元组的每个元素都是指针。并且大小为4或8字节。以下假设为后者。仅计算列表和元组中的指针就占用了一半

我正在经历一个涉及快速处理和大数据的编程挑战。我试图生成一个数字范围内可能的排列列表,然后搜索它们

代码:

问题是,当A为6,B为25时,我的程序速度大大降低,占用了大量RAM。大约有13场演出。列表的长度约为127 mil,每个对象的长度为6。这将使内存的使用量达到750兆左右,而不是13兆。发生什么事了


编辑:数据只是数字。所以[[0,1,2,3,4,5],[0,1,2,3,4,6],…]

列表或元组的每个元素都是指针。并且大小为4或8字节。以下假设为后者。仅计算列表和元组中的指针就占用了一半的空间。其余的可能是对象头,大约48字节。这就产生了一个公式:

(48+8+(8*6)) * 127000000 == 13208000000 
大约是13G


我建议尽一切可能避免生成完整的排列。

下面是如何输出整个排列列表的示例:

import itertools

def combo(b):
    for combination in range(0, b):
        yield combination

def generate_list(numA, numB):
    for l in itertools.permutations(combo(numB), numA):
        yield list(l), len(l)

if __name__ == '__main__':
    total_length = int()
    with open('permutations', 'w+') as f:
        f.write('[')
        for permutation in generate_list(6, 25):
            data, length = permutation
            total_length += length
            f.write(str(data) + ', ')
        f.write(']\n')
    print("initial dictionary length: " + str(total_length))
我已经把你的代码变成了两个独立的生成器。一个给出组合,另一个给出排列

您可以在不使用MemoryError的情况下计算整个过程并将其写入文件。一个很大的文件。或者你可以把它打印到stdout上,由你决定


它还将在最后告诉您长度,而不需要大量内存。

这是什么挑战?有没有办法访问描述和数据?数据只是数字。所以[[0,1,2,3,4,5],[0,1,2,3,4,6],…]我犯了一个错误。我的意思是列出我键入字典的位置。我猜这里的挑战是首先避免创建这么多对象-你应该重新考虑彻底创建置换。有没有办法向置换函数添加过滤器,或者重写函数更容易?谢谢!我想我必须用另一种方式去做,但知道我为什么失败总是好的,不仅仅是我失败了。
import itertools

def combo(b):
    for combination in range(0, b):
        yield combination

def generate_list(numA, numB):
    for l in itertools.permutations(combo(numB), numA):
        yield list(l), len(l)

if __name__ == '__main__':
    total_length = int()
    with open('permutations', 'w+') as f:
        f.write('[')
        for permutation in generate_list(6, 25):
            data, length = permutation
            total_length += length
            f.write(str(data) + ', ')
        f.write(']\n')
    print("initial dictionary length: " + str(total_length))