ヾ(´・ω・`)ノ゙

2018年03月25日

memo C-api






前に、pythonのC拡張モジュールで、numpyの配列を作ってそれを返すコードを書いたら
うまくメモリが開放されず、解決策がわからなくて使うのをあきらめたことがあった(´・ω・`)
(※windows環境です)

x = mymodule.test_array(100000000); # 100000000個の要素の配列が返ってくる
x = None # 新しい値で上書きしてもメモリ使用量が減らない\(^o^)/

こんな感じになっちゃってて困ってたんですが
どうやら原因がわかったぽい

mallocを使ってメモリを確保してたのがいけなかったみたい
PyDataMem_NEW または PyDataMem_NEW_ZEROED
を使うようにしたら新しい値で上書きしたとき
メモリが開放されるようになたったヾ(´・ω・`)ノ゙

こんな感じで大丈夫だった(※ぼくが気づいてないだけでなんかまずいとこがあるかもしれませんが)

double* arr = PyDataMem_NEW(sizeof(double) * n);
for (int i=0; i < n; i++) arr[i] = 777;
npy_intp dims[1] = {n};
PyObject *ret= PyArray_SimpleNewFromData(1, dims, NPY_DOUBLE, arr);
PyArray_ENABLEFLAGS((PyArrayObject*)ret, NPY_ARRAY_OWNDATA);
return Py_BuildValue("N", ret);

このページのコメント欄のおかげで解決した
https://github.com/numpy/numpy/issues/8253
↑の質問者の人はLinuxやOSX環境ではcallocでメモリを確保してるコードで
大丈夫だったらしいのでwindows環境のみで発生するパターンなんですかね


とりあえず配列返せてよかった(´・ω・`)



posted by hage at 03:17| python | このブログの読者になる | 更新情報をチェックする