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