我有一个使用 PyO3 的 Rust 库,我的一个函数如下所示:
#[pyfunction]
pub fn my_func<'a>(py: Python<'a>) -> PyResult<&'a PyBytes> {
let my_data: Vec<u8> = do_stuff(); // very large data here, >1GB
let result = PyBytes::new(py, &my_data[..]);
println!("Returning {} bytes to Python", my_data.len());
Ok(result)
}
从 Python 中,我可以成功获取我的数据:
import MyLibrary
result : bytes = MyLibrary.my_func()
我发现我第一次调用它时,它工作正常。我第二次调用它时,我的库打印出消息然后失败,给了我类似的东西memory allocation of 1073741824 bytes failed
——这意味着失败发生在它们之间的内存传递中。
如果我按顺序运行其中两个调用,我会发现我的 RAM 利用率在第一次调用后大约为 11 GiB;在第二次调用失败之前,它会飙升至 >16 GiB。现在,我正在做一些测试,其中我实际上并没有使用返回数据,只是简单地覆盖它;基本上:
for i in range(10):
result = MyLibrary.my_func()
print(len(result))
看来我的数据是在 Rust 中分配的,返回给 Python,然后没有被释放。我可以做些什么(在 Rust 或 Python 中)来确保内存被释放?