0

如果我这样做,是否在 StringIO 之间共享内存?我的感觉是因为python进程的内存在第6行没有增加。

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'

但是我担心的是,当我删除这两个变量时,python 进程的内存消耗不再减少......为什么?此代码是否会造成内存泄漏?

当我只使用一个变量时,当我删除该变量时,内存得到了很好的释放。

我很想更好地了解这里发生了什么。谢谢。

4

1 回答 1

4

StringIO()对象不会复制传递给它的字符串。没有必要,因为字符串是不可变的。

StringIO()块中的对象读取数据时,会创建新的字符串对象,这些对象是原始输入字符串的子字符串。

释放对象时,内存消耗不会立即下降。内存分配仅根据操作系统的需要重新分配,并且许多类型的(小)对象可以由 Python 进行实习以提高效率,并且永远不会被释放,只会被重用。

于 2013-07-06T13:11:36.197 回答