2012-04-10 5 views
0

pythonはすべての文字列をathene_poolに格納し、決してそれらを解放しないので、最近bigtext prcocessingが私を悩ませました。 記事の内容をredisに保存し、redisclientからそれらをフェッチしてhttpレスポンスに送信します。シリアル化によってメモリが過剰になることがありますが、このような問題を解決する良いアイデアはありますか? djangoがあまりにも多くのレスポンスを生成したかどうか、メモリを節約するためにそれらをどのように解放するのでしょうか?pythonがあまりにも多くのbigtextを処理していると、メモリがオーバーフローします。

答えて

1

Pythonはすべての文字列をプールしません。Are strings pooled in Pythonを参照してください。

たとえば、この10K文字列がプールされていません。

>>> a = '5' * 10000 
>>> b = '5' * 10000 
>>> a is b 
False 

をしかし、短い5文字の文字列では、プールされた:

>>> a = '5' * 5 
>>> b = '5' * 5 
>>> a is b 
True 

エルゴ:あなたは長い間心配する必要はありません。文字列は必要以上に長くメモリに保持されます。

+0

について 'is'テストについて:2つのオブジェクトが実際に同じオブジェクトである場合、Pythonは「演算子テスト」です。この場合、私は2つの文字列が1つの文字列にマージされたかどうかを確認するために演算子を乱用しています。 – Ondergetekende

+0

短い文字列であっても、ソースコード内の文字列リテラルとして出現した場合(または、ある種の関数 'sys' IIRCによって明示的に中断されている場合)にのみプールされます。コンパイラは、関数に入れて 'dis.dis'を実行すると、スニペットの' 5' * 5'を '55555'に定数倍します。 – delnan

関連する問題