Python 如果我读取元组而不是单个值,则会泄漏内存

Python leaks memory if I read a tuple instead of single value

我正在使用 Python 查询 RocksDB 数据库中是否存在某个键。 API(见底部)暗示它 returns 是一个二元组。所以我收到了两个元组元素:

def contains_key(database: rocksdb, key: int) -> bool:
    found, data = database.key_may_exist(key)
    return found

我是这样使用它的:

if not contains_key(database, key):

但是,这会导致内存泄漏。

为了证明这一点,如果我将代码更改为:

def contains_key(database: rocksdb, key: int) -> bool:
    return database.key_may_exist(key)

没有泄漏(但显然不正确)

如何让第一个版本在没有内存泄漏的情况下运行?

您的代码

def contains_key(database: rocksdb, key: int) -> bool:
    found, data = database.key_may_exist(key)
    return found

不包含内存泄漏。

founddata 是本地作用域中的两个名称,都指存在于单个内存区域中的值。当函数 returns、founddata 超出范围时。 found 引用的内容可以被调用者(x = contains_key(db, 3))引用,但 data 被忽略。由于不存在对该对象的其他引用,Python(作为一种垃圾收集语言)自动回收专用于 data 的所有资源。

就此而言,key_may_exist 方法 returns 一个您永远无法安全引用的元组。它会立即解包,founddata 指的是该元组所指的任何内容。元组本身已被垃圾收集,但对其内容的引用仍然存在。