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
不包含内存泄漏。
found
和 data
是本地作用域中的两个名称,都指存在于单个内存区域中的值。当函数 returns、found
和 data
超出范围时。 found
引用的内容可以被调用者(x = contains_key(db, 3)
)引用,但 data
被忽略。由于不存在对该对象的其他引用,Python(作为一种垃圾收集语言)自动回收专用于 data
的所有资源。
就此而言,key_may_exist
方法 returns 一个您永远无法安全引用的元组。它会立即解包,found
和 data
指的是该元组所指的任何内容。元组本身已被垃圾收集,但对其内容的引用仍然存在。
我正在使用 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
不包含内存泄漏。
found
和 data
是本地作用域中的两个名称,都指存在于单个内存区域中的值。当函数 returns、found
和 data
超出范围时。 found
引用的内容可以被调用者(x = contains_key(db, 3)
)引用,但 data
被忽略。由于不存在对该对象的其他引用,Python(作为一种垃圾收集语言)自动回收专用于 data
的所有资源。
就此而言,key_may_exist
方法 returns 一个您永远无法安全引用的元组。它会立即解包,found
和 data
指的是该元组所指的任何内容。元组本身已被垃圾收集,但对其内容的引用仍然存在。