web-dev-qa-db-ja.com

Python:メモリ管理をチェックする方法をCtypes

したがって、PythonをフロントエンドGUIとして使用し、バックエンドとしてストレージおよびメモリ管理のためにいくつかのCファイルと対話します。GUIのウィンドウが閉じられるか終了するたびに、すべてのデストラクタメソッドを呼び出します私の割り当てられた変数のために。

プログラム全体を終了する直前に、C Valgrindチェックなどのメモリリークや可用性をチェックして、メモリリークがないことを確認する方法はありますか?

出口の例:

from tkinter import *
root = Tk()  # New GUI
# some code here

def destructorMethods:
    myFunctions.destructorLinkedList()  # Destructor method of my allocated memory in my C file
    # Here is where I would want to run a Valgrind/Memory management check before closing
    root.destroy()  # close the program

root.protocol("WM_DELETE_WINDOW", destructorMethods)  # When the close window option is pressed call destructorMethods function

9
notMyName

Valgrindを使用する場合は、この readme が役立ちます。たぶん this は、Valgrindをフレンドリーにするための別の優れたリソースである可能性がありますpythonをプログラムで使用します。

しかし、tracemallocのような他のものを検討する場合は、その使用例 here を簡単に取得できます。例は非常に簡単に解釈できます。たとえば、彼らのドキュメントによると、

  import tracemalloc
  tracemalloc.start()

  # ... run your application ...
  snapshot = tracemalloc.take_snapshot()
  top_stats = snapshot.statistics('lineno')
  print("[ Top 10 ]")
  for stat in top_stats[:10]:
  print(stat)

これは次のようなものを出力します。

 <frozen importlib._bootstrap>:716: size=4855 KiB, count=39328, average=126 B
 <frozen importlib._bootstrap>:284: size=521 KiB, count=3199, average=167 > 

これを解析して調査のメモリ使用量をプロットするか、参照 doc を使用してより具体的なアイデアを得ることができます。

この場合、プログラムは次のようになります。

 from tkinter import *
 import tracemalloc
 root = Tk()  # New GUI
 # some code here

 def destructorMethods:
     tracemalloc.start()
     myFunctions.destructorLinkedList()  # Destructor method of my allocated memory in my C file
     # Here is where I would want to run a Valgrind/Memory management check before closing
     snapshot = tracemalloc.take_snapshot()
     top_stats = snapshot.statistics('lineno')
     print("[ Top 10 ]")
     for stat in top_stats[:10]:
         print(stat)
     
     root.destroy()  # close the program

 root.protocol("WM_DELETE_WINDOW", destructorMethods)  

別のオプションは、メモリプロファイラーを使用して、可変時間でのメモリ使用量を確認することです。パッケージは入手可能です ここ 。このパッケージのインストール後、おそらくスクリプトで次のコマンドを使用して、pngファイルのメモリ使用量を経時的に取得できます。

 mprof run --include-children python your_filename.py
 mprof plot --output timelyplot.png

または、必要に応じて、memory_profilerパッケージで利用可能なさまざまな関数を使用できます。多分 this チュートリアルはあなたにとって興味深いものになるでしょう。

2
moyeen52

trace pythonメモリリーク この記事をご覧になり、詳細については、これらの質問を参照してください。SO:

1
andreagalle

リーク検出をサポートするデバッグメモリアロケータを使用できると思います。

Tcmallocのような何かがします。 LD_PRELOADするだけで、malloc、freeなどのすべての呼び出しでリークがデバッグされます。

0
rostamn739