2011-11-11 8 views
1

私が読んだこの記事によると、不変型は不滅になる可能性があります。私は現在、Googleのアプリエンジン上で実行されている私のWebサービスのメモリ使用量の問題を解決するために取り組んでいますPythonはタプル用のメモリを解放しませんか?

http://effbot.org/pyfaq/why-doesnt-python-release-the-memory-when-i-delete-a-large-object.htm

。 "タプルを多用する"ことは、この問題の原因となる可能性がありますか?返信用


ありがとう: 私はGoogleのApp Engineのバックエンドインスタンス上で私のコードを実行していると、それはメモリ使用量上限(128メガバイト)を持っています。私は許可されているより多くのメモリを使用し、インスタンスを停止したと言いました。コメントに記載されているように、「メモリリーク」ではなく「メモリ使用量が大きい」となる可能性があります。

+1

「メモリリーク」は、私の本の「メモリ使用量*が高いメモリ使用量の短い期間の後に大きい」(これはその記事で説明したとおりです)と微妙に異なります。どのようなケースかを明確にすることができますか?記事によれば、スペースは再利用されます - 将来の大量配分のための大きなメモリを用意し、自発的に返却しません。 – delnan

+0

私はdelnanに同意します。この記事では、タプルや不変型について何も言及していません。なぜあなたの質問がタプルに焦点を当てているのか分かりません – TJD

+1

あなたのメモリの問題のトラブルシューティングに役立ついくつかのアイデア: print resource.getrusage(resource.RUSAGE_SELF)[2] '現在の最大常駐セットサイズのスナップショットを取得するか、' cat/proc/18444/status'はプロセスの詳細なメモリ情報を表示します。より良いもの:http://mg.pov.lt/blog/hunting-python-memleaks – chown

答えて

5

この記事は不変のタイプを指定していない - それが指定されています。

過度のメモリ使用量のための別の原因は、Pythonは整数と浮動小数点数を含む特定のオブジェクトタイプのためのいわゆる「空きリスト」を使用していることです。

GAEプロセスでどのような情報が得られるのかわかりませんが、自分のシステムでこの実験を試すことができます。

まず、Pythonインタプリタを起動し、そのプロセスを見つけます。次に、このコマンドを実行します。

>>> many_tuples = [() for x in range(5000000)] #replace with xrange for 2.x 

次に、メモリ使用量を見てください。 500万のタプルのリストを作成しました。今入力します。私のシステム(のPython 3.2、勝つ7)で

>>> del many_tuples 

を、私のメモリ使用量を約20Kまで撮影し、私del変数を編たら、同じ量だけ低下しました。あなたのプロセス(CPU、メモリ使用量)に関する情報を得ることができれば、それを試すことができます - 多分何度も連続して、あなたはより高いメモリ使用量のいくつかのスパイクを与える必要があります。

1

あなたがリンクしている記事では、タプルはPythonが独自のフリーリストを保持するタイプの1つであることはわかりません。彼らはうまくいくかもしれないが、this articleによれば、特定の犯人はints、floats、dicts、およびlistsである。その記事は、2005年からのものであり、物事はそれ以来変更されている可能性がありますが... Pythonの2.6以降で

は、int sおよびfloatのが、すべてのための無料のリストは私にはないと思いgc.collect(2)、としてクリアすることができますGAEでお手伝いしますが、私はそれについて言及したいと思いました。

1

不変型は不変ではありません。占めていたメモリはまだPythonによって所有されていますが、他のオブジェクトでも使用できます。あなたはそのParentへのリンクをChild、およびそのChildへのリンクParentを持っているこの時点で

class Parent(object): 
    def __init__(self): 
     self.offspring = Child(self) 
    def __del__(self): 
     # doesn't matter what goes here, gc will not be able to auto collect 
     # freed Parents and Childs 

class Child(object): 
    def __init__(self, parent): 
     self.parent = parent 

John_Doe = Parent() 

、およびPythonは問題がある可能性があります

循環依存関係は、あなたのメモリリークの可能性ありそれらを解放する。

関連する問題