2017-09-06 63 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

我不是不贊同你的一點。你的回答非常好。 –