0

私がそうすると、メモリは StringIO 間で共有されますか? 6行目でpythonプロセスのメモリが増えていないからだと思います。

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'

しかし、私の懸念は、これらの 2 つの変数を削除しても、python プロセスのメモリ消費量が減少しないことです...なぜですか? このコードはメモリ リークを引き起こしますか?

変数を 1 つだけ使用した場合、変数を削除すると、メモリが十分に解放されます。

ここで何が起こっているのかをよりよく理解したいと思います。ありがとう。

4

1 に答える 1

4

StringIO()オブジェクトは、渡された文字列のコピーを作成しません。文字列は可変ではないため、その必要はありません。

オブジェクトからチャンクでデータを読み取る場合StringIO()、元の入力文字列の部分文字列である新しい文字列オブジェクトが作成されます。

オブジェクトを解放しても、メモリ消費量がすぐに減ることはありません。メモリ割り当ては、OS によって必要に応じて再分配されるだけであり、多くのタイプの (小さい) オブジェクトは、効率のために Python によってインターンすることができ、解放されることはなく、再利用されるだけです。

于 2013-07-06T13:11:36.197 に答える