0

我有一个使用 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 中)来确保内存被释放?

4

0 回答 0