-4

我在这里的主要目标是从这个程序中为我的研究程序获取结果,所以即使有人有一个我可以下载的这样一个排列集的现成数据库,它也会对我在这里的任务有所帮助。

也就是说,如果我可以自己生成它,那将是我正在做的事情的一个优势。

程序:

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?

或者,我可以使用一些技巧将程序分成可管理的块吗?

4

1 回答 1

3

根据以下测试,每个元素(12 个元素元组)大约需要 144 个字节。(窗口 7 64 位,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'))
于 2013-07-27T05:21:27.307 回答