0

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 オブジェクトが増加し続けていることがわかります。

PyTuple_New など、すべての PyObject に関連するメモリ リークがあるようです。

しかし、返されたすべてのオブジェクトは参照カウントとして 1 を持っているため、Python でスコープ外に出た後に破棄されることが予想されます。最後に、私のプログラムread access violationはコードのランダムな部分で終了します。足りないものはありますか?または、これをデバッグして、何が起こっているのかをよりよく理解する方法を知っている人はいますか? 私は絶望的です!

4

0 に答える 0