2016-10-20 5 views
2

これが可能かどうかはわかりません...python - すべてのインポートのメモリコストをプロファイルしますか?

私は大きなメモリサイズに成長する大きなPythonアプリケーションを持っています。可能であれば、プロセスの成長を最小限にするためにimportステートメントで追跡したいと考えています。

私が見つけた最も近いのは、ラインプロファイリング機能memory_profilerです。しかし、それは "トップレベル"のメモリをプロファイルするだけですimportステートメント - 私はすべての従属インポートの内訳を欲しがります。私は、インポートステートメントにメモリサイズを追跡できるプロファイラは見つかりませんでした。

最近の監査では、importステートメントをtry/exceptブロックにドロップするだけでサードパーティフレームワークのサポートを可能にするいくつかのPyPiモジュールが示されているため、独自のコードを最適化することだけでは不安です。

try: 
    import bottle 
    # declare bottle support here 
except: 
    pass 

私のアプリはvirtualenvの中で展開されますが、展開の一部であり、同じvirtualenvの中で実行し、いくつかの他の兄弟のサービスがある... 1:

は、例えば、1つのライブラリがこれをしませんでしたそのうちbottleを使用します。

この「パターン」は、私が使用するライブラリの一部で使用されており、望ましくない/不要なモジュールのオーバーヘッドは、このアプリケーションのメモリインプリントのかなりの量にあります(手動による分離と測定に基づく)。私はどのライブラリにパッチを当てるべきか、どのライブラリを無視しても問題ないかを知りたい。

+0

'sys.getsizeof'はどうですか?例えば。 'import pandas;モジュール上で動作しないprint(getsizeof(pandas)) ' – blacksite

+0

。 'pympler'は' asizeof'関数を持っていますが、これはうまくいくようです。私は輸入声明を無効にすることになったが、それは私に輸入の注文を与えた(それはいくらか追跡しやすくなった)。 –

答えて

1

多くの運がなかった後、私は不気味なアイデアがあり、ややうまく機能します。

私はimportステートメントをオーバーライドして、各インポートの前後の所定のプロセスの現在のメモリを計算しました。これはすべての輸入状況をカバーしているとは思わないが、それは良いスタートだ。私はこれを単純に印刷し、コピーしてファイルに貼り付けてから、素早く前処理して、各呼び出しのインデックスと増加/合計を追跡するcsvに変換しました。それは私の現在のニーズに十分です。

import os 
import psutil 
import __builtin__ 
this_process = psutil.Process(os.getpid()) 
realimport = __builtin__.__import__ 
def myimp(name, *args, **kwargs): 
    try: 
     _mem_start = this_process.get_memory_info()[0] 
     r = realimport(name, *args, **kwargs) 
     _mem_finish = this_process.get_memory_info()[0] 
     _mem_growth = _mem_finish - _mem_start 
     print "import|%s,%s,%s,%s" % (name, _mem_growth, _mem_start, _mem_finish) 
     return r 
    except: 
     raise 
__builtin__.__import__ = myimp 

これを行うにはより良い方法がありますが、このようなアプリのプロファイルを作成するためのより良い方法があることを願っています。今のところ、私は実用的な解決策を持っています。

関連する問題