2013-07-06 70 views
0

如果我這樣做的話,是否在StringIO之間共享內存?我有一種感覺那是因爲蟒蛇進程的內存沒有上線增加6python:StringIO之間共享的內存?

In [1]: from StringIO import StringIO 
In [2]: s = StringIO() 
In [3]: s.write('abcd'*10000000) # memory increases 
In [4]: s.tell() 
Out[4]: 40000000 
In [5]: s.seek(0) 
In [6]: a = StringIO(s.read()) # memory DOES NOT increase 
In [7]: a.tell() 
Out[7]: 0 
In [8]: a.read(10) 
Out[8]: 'abcdabcdab' 

但是我關心的是,當我刪除這些兩個變量,蟒蛇進程的內存消耗不會再降低...爲什麼?此代碼是否會造成內存泄漏?

當我只使用一個變量時,當我刪除該變量時,內存被充分釋放。

我很想好好理解這裏發生了什麼。 謝謝。

回答

3

A StringIO() object does not將一個字符串的副本傳遞給它。沒有必要,因爲字符串不可變。

當從塊中的StringIO()對象讀取數據時,將創建新的字符串對象,它們是來自原始輸入字符串的子字符串。

釋放對象時內存消耗不會立即下降。內存分配只能根據操作系統的需要進行重新分配,並且許多類型的(小)對象可以由Python進行實現以提高效率,並且永遠不會釋放,只能重用。

+0

好的我知道爲什麼以塊讀取對象會創建新的字符串對象。沒關係。我只想確保每次創建新的StringIO時原始數據字符串都不會重複,這看起來是正確的嗎?我試圖讓一位作家和幾位讀者不重複原始數據。 – Michael

+0

@YAmikep:讀者不會複製字符串。 –

+0

它以StringIO的方式工作,但它似乎與cStringIO不同。使用cStringIO似乎複製了內存中的字符串,因爲它每次都會增加:reader = StringIO(); reader.write(source.getvalue())有趣。 – Michael