2017-09-06 40 views
0

我想要一个千兆字节的数据字符串。python2.7内存限制版本

使用此代码

length = 0x20000000 

payload = ''.join(random.choice(string.printable) for _ in range(length)) 

但蟒除外和打印这个错误 “的MemoryError”

充满错误消息:

payload = ''.join(random.choice(string.printable) for _ in range(length)) 
MemoryError 

我发现在堆栈溢出这种除外情况下。

使用“import sys,sys.setrecursionlimit(10 ** 6)”将修复它!

所以,我加入了这段代码。

但没有解决!

我不能“导入资源”。因为,不可不安装..

+0

啊..你有很好的方法来创造很多stirng吗? –

+0

你的系统有多少内存? –

+0

我的笔记本电脑有8g! –

回答

1

我认为你最好的选择是使用bytearray:我的机器上

barray = bytearray() 
length = 0x20000000 
for _ in range(length): 
    barray.append(random.choice(string.printable)) 

这仅消耗约0.5演出。

请注意,增加递归限制在这里不会帮助你,事实上你根本没有使用递归。你只是在做一些非常大的东西。指针基本即得到由''.join创建将需要约0x20000000 * 8 * 1e-9 == 4.294967296千兆字节list的只是阵列,而且不计list自己串,每一个都需要一个完整的Python对象,这是另一个40所以每个对象的字节数,所以你看,你只是用完了内存。所以考虑到你的个人字符串对象:

>>> 0x20000000 * (48) * 1e-9 
25.769803776000003 

所以你需要超过20场演出!可以在一些现代笔记本电脑上使用,但8个演出肯定是不够的。

+0

任何直接可变容器(所以不是一个列表)将工作。你的解决方案可能是最简单的。 numpy数组会工作。很好看。 –

+0

@MadPhysicist是的,'numpy.array'可以工作,但'bytearray'基本上是Python 2中的一个可变字符串,所以这可能是最合适的。 –

+0

我不是不赞同你的一点。你的回答非常好。 –