gpt4 book ai didi

python - 传递给 C 的 SWIG 生成对象的内存管理

转载 作者:太空宇宙 更新时间:2023-11-04 13:17:59 25 4
gpt4 key购买 nike

我正在尝试使用 SWIG 包装一个用 C++ 编写的 Python 库。该库使用接受字节缓冲区作为参数的函数调用。在 Python 中,我使用来自 SWIG 的 %array_class 创建这些字节缓冲区。我制作了一个概念验证程序来对此进行测试,我注意到与将这些缓冲区传递给 C++ 相关的显着内存泄漏。具体来说,运行下面的代码稳步提高 Python 应用程序的内存使用量(如在任务管理器中观察到的那样)高达大约 250MB,程序在此处停止。 C 的打印输出表明该程序确实按预期运行,但只是占用了更多内存。 del buff 语句运行,但不释放内存。我尝试在每个循环中创建和删除缓冲区,但结果相同。在 C++ 中运行 delete x; 会使我的程序完全崩溃。

我的 Swig 接口(interface)文件:

%module example
%include "carrays.i"
%array_class(uint8_t, buffer);
%{
#include "PythonConnector.h"
%}
%include "PythonConnector.h"

C 头文件:

class PythonConnector {
public:
void print_array(uint8_t *x);
};

最小的 C 定义函数

void PythonConnector::print_array(uint8_t *x) 
{
//int i;
//for (i = 0; i < 100; i++) {
// printf("[%d] = %d\n", i, x[i]);
//}
//delete x; // <-- This crashed the program
return;
}

测试器 Python 脚本

import time
import example

sizeBytes = 10000
buff = example.buffer(sizeBytes)
for j in range(1000):
# Initialize data buffer
for i in range(sizeBytes):
buff[i] = i%256
buff[0] = 0
example.PythonConnector().print_array(buff.cast())
print(j)
del buff
time.sleep(10)

我错过了什么吗?我怀疑 SWIG 会在每次将缓冲区传递给未进行垃圾回收的 C++ 时创建一些代理对象。

编辑:

  • SWIG 版本 3.0.7
  • CPython 版本 3.5 x64
  • Windows 10 操作系统

感谢您的帮助。

最佳答案

好的,感谢@Flexo,我找到了答案。

问题是在每个循环中创建的 example.PythonConnector() 的实例化。仅在循环外实例化一次似乎可以解决内存问题:

import time
import example

sizeBytes = 10000
buff = example.buffer(sizeBytes)
conn = example.PythonConnector()
for j in range(1000):
# Initialize data buffer
for i in range(sizeBytes):
buff[i] = i%256
buff[0] = 0
conn.print_array(buff.cast())
print(j)
del buff
time.sleep(10)

仍然存在一个问题,为什么许多连接器没有在原始代码中进行垃圾回收。

关于python - 传递给 C 的 SWIG 生成对象的内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36477016/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com