如何解决将 PyBytes 从 Rust 传递到 Python 时,如何确保正确释放内存?
我有一个使用 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 中)来确保内存被释放?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。