我的主要目标是从我的研究计划获得该程序的结果,所以即使有人有我可以下载的这种排列集的现成数据库,这对我的任务也很有帮助。
那就是说,如果我能够自己生成它,那对我正在做的事情来说将是一个优势。
程序:
import itertools
set=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l']
perm=list(itertools.permutations(set, 12))
print perm
我遇到的问题是硬件问题。
我的硬件规格如下:
imac 27in late 2012
Mac OSX Mountain Lion
8GB 1600MHz DDR3 RAM
Intel 3.4GHz i7
1TB HD with a bit more than 50% free space.
我尝试运行程序时收到的消息是启动磁盘上没有足够的内存来保持程序打开,它要求我强行退出程序。它会冻结,然后我必须在硬重启后修复我的权限才能让所有内容再次顺利运行,所以:
我不建议按原样运行本程序,除非您已经知道您的系统可以处理它。
但是,我的估计是这个程序在(我认为)大小12输出一个列表!这是一个不大的...超过500,000,000个排列(输出的实际大小可能小于12!,但它大于指数)。
那么,我怎样才能获得这些数据?我需要一个新系统吗?如果是这样,我需要多少空间或RAM?
或者,是否有一些技巧可以将程序拆分为可管理的块?
答案 0 :(得分:3)
根据以下测试,每个元素(12个元素元组)大约需要144个字节。 (Window 7 64bit,Python 2.7.5)
>>> import sys
>>> sys.getsizeof(('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'))
144
排列将产生12!元件。
>>> reduce(lambda a,b:a*b, range(1,12+1)) # 12!
479001600
需要大约68GB的内存。
144 * 479001600 = 68,976,230,400
保存到磁盘大约需要6 + GB。 (13 * 479001600 = 6,227,020,800)(换行1个字节)
import itertools
with open('permutations.txt', 'wb') as f:
f.writelines(''.join(xs) + '\n' for xs in itertools.permutations('abcdefghijkl'))