Python读取RocksDB返回元组触发内存泄漏该如何解决
问题根因
你所用的Python RocksDB绑定(主流如python-rocksdb)中,key_may_exist接口返回的二元组第二个元素是底层C++层分配的内存对象,当你将其赋值给局部变量后,如果没有正确触发资源回收逻辑,底层内存就无法被释放,进而引发泄漏。你直接返回整个元组时,元组会被调用方正常持有和销毁,底层资源也会跟着被正确释放,因此不会出现泄漏问题。
解决方法
以下两种方案都可以在不改动业务逻辑的前提下解决内存泄漏问题:
- 用无名占位符接收第二个返回值,使用后手动删除引用触发回收
def contains_key(database: rocksdb, key: int) -> bool: found, _ = database.key_may_exist(key) del _ return found
- 直接通过下标取元组的第一个返回值,完全不生成第二个元素的局部引用
def contains_key(database: rocksdb, key: int) -> bool: return database.key_may_exist(key)[0]
注意事项
如果修改后仍存在泄漏,可以尝试升级你使用的RocksDB Python绑定到最新稳定版,部分旧版本本身存在key_may_exist返回值资源回收的bug。
内容的提问来源于stack exchange,提问作者user997112
相关产品推荐
相关产品推荐

