1

私はPythonとそのC APIにかなり慣れていません。参照カウントの仕組みがまだわかりません。私は、過去に作成してテストした多数の C++ スレッド追跡関数を Python に公開する粒子追跡用のモジュールを作成しました。(私が知る限り、メモリリーク自体はありません)。

Python 内からこれらの関数の 1 つを繰り返し呼び出すと、メモリ使用量がゆっくりと増加していることがわかります。どこか (おそらくどこでも :O) にメモリ リークがあると思います。メインの追跡関数の関連するフラグメントの下にコピーして、Py_DECREFs を呼び出す必要があるかどうかを誰かが指摘できるようにしました (たとえば、item_py で?)。

PyObject* _track_particles() {

        // more code here ... (no Python/C API  calls) 

        PyObject* result_py = PyTuple_New(particles.size());
        for(int i=0; i<particles.size(); ++i) {
            PyObject* item_py = PyTuple_New(2);
            if (lost_at_turn_idx[i] == PARTICLE_NOT_LOST) {
                int offset = i * (nr_turns+1) * 6 + nr_turns * 6;
                PyTuple_SetItem(item_py, 0, Py_True);
                PyTuple_SetItem(item_py, 1, Py_BuildValue("(dddddd)", 
                            data_out[offset + rx], data_out[offset + px],   
                            data_out[offset + ry], data_out[offset + py],
                            data_out[offset + de], data_out[offset + dl]));
            } else {
                PyTuple_SetItem(item_py, 0, Py_False);
                PyTuple_SetItem(item_py, 1, 
                        Py_BuildValue("(ii)", lost_at_turn_idx[i], 
                                              lost_at_element_idx[i]));
            }
            PyTuple_SetItem(result_py, i, item_py);
        }       
        return result_py;
    }

ps:このリファレンスは役に立ちました

4

2 に答える 2

1

これは関連していますか?

t = PyTuple_New(n)代わりに を使用し、 を使用してオブジェクトで埋めPyTuple_SetItem(t, i, o)ます。oPy_INCREF()

この一節が明確かどうかは完全にはわかりませんが、良い出発点になるかもしれません。

于 2012-11-14T13:32:21.553 に答える