微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将 PyBytes 从 Rust 传递到 Python 时,如何确保正确释放内存?

如何解决将 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 举报,一经查实,本站将立刻删除。