排列字符列表占用了我所有的内存(Python)
我正在建立一个包含所有字母和数字的字典。这段代码的问题是在几秒钟内消耗了我100%的内存。你认为我的执行不好吗? 感谢您的帮助排列字符列表占用了我所有的内存(Python),python,Python,我正在建立一个包含所有字母和数字的字典。这段代码的问题是在几秒钟内消耗了我100%的内存。你认为我的执行不好吗? 感谢您的帮助 from timeit import Timer from itertools import permutations dictionary = [] small_alpha = map(chr, range(97,123)) lookup.append(small_alpha) def test(): for i in permutations(looku
from timeit import Timer
from itertools import permutations
dictionary = []
small_alpha = map(chr, range(97,123))
lookup.append(small_alpha)
def test():
for i in permutations(lookup, 10):
dictionary.append(''.join(i))
if __name__ == '__main__':
test()
编辑
我是一个受过良好教育的人。没有黑客攻击的意图。这实际上是不可能的,即使我有100台机器。没有人能计算出这么大的数字。只是尝试一下,如果在某种程度上可能的话,有36个/36-10! = 922393263052800 10个字母数字字符的1千万次排列。当然这会占用你所有的记忆 假设在64位机器上,每个字符串需要32个字节来存储指针的8个字节、长度的8个字节、内容的16个字节*,这需要26.2的内存 没有办法将所有排列存储在普通机器中。请说明你真正想做什么 *:实际上,它需要的远不止这些,因为还有类型信息,在Python3.x中,UTF-16需要2个字节的字符,列表本身也需要内存
即使只使用字母表,排列的数量仍然是19275223968000~20万亿,每个字符串32个字节仍然需要561 TiB的内存。有36个/36-10! = 922393263052800 10个字母数字字符的1千万次排列。当然这会占用你所有的记忆 假设在64位机器上,每个字符串需要32个字节来存储指针的8个字节、长度的8个字节、内容的16个字节*,这需要26.2的内存 没有办法将所有排列存储在普通机器中。请说明你真正想做什么 *:实际上,它需要的远不止这些,因为还有类型信息,在Python3.x中,UTF-16需要2个字节的字符,列表本身也需要内存
即使只有字母表,排列的数量仍然是19275223968000~20万亿,每个字符串32字节仍需要561 TiB内存。您应该利用云来解决这个问题。使用GNUparallel将为您提供额外的资源来帮助您构建字典 你应该利用云来解决这个问题。使用GNUparallel将为您提供额外的资源来帮助您构建字典 您需要大约90077467 GB的内存来存储结果数据
2GB内存价格为13美元http://www.newegg.com/Product/Product.aspx?Item=N82E16820146214,因此,您可以以585503535.50美元的低价轻松解决此问题。您需要大约90077467 GB的内存来存储结果数据
2GB内存价格为13美元http://www.newegg.com/Product/Product.aspx?Item=N82E16820146214,因此,您可以以585503535.50美元的低价轻松解决此问题。您的做法非常正确,使用itertools提供生成器,而不是实际生成列表-直到您尝试创建列表为止。这个列表将耗尽你所有的记忆,因为它实际上是巨大的。您可能应该将其写入文件,而不是尝试在内存中创建列表,但您将需要大量磁盘空间。您的做法非常正确,使用itertools提供生成器而不是实际生成列表-直到您尝试创建列表为止。这个列表将耗尽你所有的记忆,因为它实际上是巨大的。您可能应该将它写入一个文件,而不是试图在内存中列出一个列表,但您将需要大量的磁盘空间。如果要使用itertools,请一直使用它 对于惰性生成器来说,这是一个完美的情况,它不需要实际存储排列或数据
import itertools
small_alpha = itertools.imap(chr, range(97, 123))
numbers = itertools.imap(chr, range(48, 58))
lookup = itertools.chain(small_alpha, numbers)
d = (''.join(i) for i in itertools.permutations(lookup, 10))
if __name__ == '__main__':
perms = list(itertools.islice(d,10))
print(perms)
如果你要使用itertools,那就一直使用它 对于惰性生成器来说,这是一个完美的情况,它不需要实际存储排列或数据
import itertools
small_alpha = itertools.imap(chr, range(97, 123))
numbers = itertools.imap(chr, range(48, 58))
lookup = itertools.chain(small_alpha, numbers)
d = (''.join(i) for i in itertools.permutations(lookup, 10))
if __name__ == '__main__':
perms = list(itertools.islice(d,10))
print(perms)
首先,有一个名为dictionary的变量,它实际上是一个列表,这非常令人困惑 假设你有足够的内存,使用起来会快得多
dictionary = list(permutations(lookup, 10))
然而,由于您没有足够的内存,这将更快地使用您的内存。首先,有一个名为dictionary的变量,它实际上是一个列表,非常混乱 假设你有足够的内存,使用起来会快得多
dictionary = list(permutations(lookup, 10))
然而,由于您没有足够的内存,这只会更快地使用您的内存您确实意识到这些字符有922393263052800种可能的排列,对吗?可能我不会进行所有计算。只要说10个字符,你就需要重新思考为什么要把它们放在字典里。在没有实际存储的情况下迭代置换非常容易,这是O1而不是On!。你打算如何处理结果?我能想到的这种排列的唯一用途就是黑客。我是一个受过良好教育的人。没有黑客攻击的意图。这实际上是不可能的,即使我有
100台机器。没有人能计算出这么大的数字。我只是在尝试,如果可能的话。你知道有922393263052800个可能的字符排列,对吧?也许我不会做所有的计算。只要说10个字符,你就需要重新思考为什么要把它们放在字典里。在没有实际存储的情况下迭代置换非常容易,这是O1而不是On!。你打算如何处理结果?我能想到的这种排列的唯一用途就是黑客。我是一个受过良好教育的人。没有黑客攻击的意图。这实际上是不可能的,即使我有100台机器。没有人能计算出这么大的数字。我只是想尝试一下在某种程度上是否可能。如果你好奇的话,我制作了1000000份['a']*10作为内存估算并从中推断,但我当然不保证我的数学……实际上,OP将它们存储为字符串,而不是数组,所以这是不对的。无论如何,这个解决方案可能超出了他的预算。如果你好奇的话,我制作了1000000份['a']*10作为内存估算并从中推断,但当然我对我的数学没有任何保证……实际上,OP将它们存储为字符串,而不是数组,所以这是不对的。无论如何,这个解决方案可能超出了他的预算。是的,我做到了。如果我愚蠢的回答是对愚蠢问题的不恰当回答,我很抱歉。可能它没有回答我的问题。但我对GNU Parallel有所了解。谢谢,我做到了。如果我愚蠢的回答是对愚蠢问题的不恰当回答,我很抱歉。可能它没有回答我的问题。但我对GNU Parallel有所了解。感谢根据其他答案,磁盘空间量是不切实际的。处理这种顺序的唯一方法是在生产过程中处理每一件东西,而不要试图保留全部。即使这样,我们也只能计算出总数的一小部分,但计算起来要慢一些。在我看来,算法试图在最佳的时间和空间内实现它们的目标。然而,在实践中,这两个目标相互矛盾。一方必须付出才能容纳另一方。他可以访问PB级的磁盘空间。也许不是,但也许他工作的公司有一个超级计算机集群,有一个巨大的SAN或其他东西无论如何,他更可能拥有磁盘而不是RAM!根据其他答案,磁盘空间量是不切实际的。处理这种顺序的唯一方法是在生产过程中处理每一件东西,而不要试图保留全部。即使这样,我们也只能计算出总数的一小部分,但计算起来要慢一些。在我看来,算法试图在最佳的时间和空间内实现它们的目标。然而,在实践中,这两个目标相互矛盾。一方必须付出才能容纳另一方。他可以访问PB级的磁盘空间。也许不是,但也许他工作的公司有一个超级计算机集群,有一个巨大的SAN或其他东西无论如何,他更可能拥有磁盘而不是RAM!