Python C API を使用して、C++ で記述した Python モジュールを繰り返し呼び出しています。私のpythonプログラムはモジュールのpyParse
関数を繰り返し呼び出します。これは一連の処理を行い、より多くのオブジェクトを要素としてPyTuple
含むを返します。PyTuple
返されたすべてのオブジェクトは最終的PyObject->refcnt
に 1 になるため、オブジェクトが Python のスコープ外になったときにオブジェクトを削除する必要があることがわかります。次の Python コードのようなもので、このモジュールを繰り返し呼び出します。
import my_module #this is my c++ module.
import os
path = 'C:/data/'
for filename in os.listdir(path):
data = my_module.pyParse(path+filename)
このループが長く実行されるほど、メモリ使用量が急増します。反復ごとに約 2kb のタプルが生成されます (反復ごとに破棄する必要があります)。PyTuple_New
しかし、「ヒープ スナップショット」を取り、初期のスナップショットと別のスナップショットを後で比較すると、呼び出されたメモリの割り当てと他の Python オブジェクトが増加し続けていることがわかります。
しかし、返されたすべてのオブジェクトは参照カウントとして 1 を持っているため、Python でスコープ外に出た後に破棄されることが予想されます。最後に、私のプログラムread access violation
はコードのランダムな部分で終了します。足りないものはありますか?または、これをデバッグして、何が起こっているのかをよりよく理解する方法を知っている人はいますか? 私は絶望的です!