【问题标题】:python: memory shared between StringIO?python:StringIO之间共享的内存?
【发布时间】:2013-07-04 09:47:13
【问题描述】:

如果我这样做,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 进程的内存消耗不再减少......为什么?此代码是否会造成内存泄漏?

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

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

【问题讨论】:

    标签: python memory stringio


    【解决方案1】:

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

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

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

    【讨论】:

    • 好的,是的,我明白为什么分块读取对象会创建新的字符串对象。没关系。我只是想确保每次创建新的 StringIO 时原始数据字符串都不会重复,看起来是这样吗?我试图在不复制原始数据的情况下拥有一位作家和几位读者。
    • 它与 StringIO 以这种方式工作,但与 cStringIO 似乎不同。使用 cStringIO 似乎会复制内存中的字符串,因为它每次都会增加: reader = StringIO() ; reader.write(source.getvalue()) 很有趣。
    • 注意你在做什么。您正在创建一个 writer 对象。请改用StringIO(source.getvalue())
    • reader.write(source.getvalue())?你不应该写信给读者。
    • 哦,好的,谢谢。但是,我尝试了 reader = StringIO(source.getvalue()) 并且当 StringIO 来自 cStringIO 时,它似乎仍然是重复的,因为内存增加的大小与第一次创建字符串时相同。好吧,我想这只是因为 StringIO 的实现在 cStringIO 中可能会有所不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    • 2021-06-01
    • 2016-07-17
    • 2012-07-03
    • 2012-07-06
    • 2014-10-13
    相关资源
    最近更新 更多