Ray中如何移除对象引用并返回对象,无需复制以减少内存占用
解决方案
你完全不需要通过深拷贝来实现需求,直接返回ray.get获取的对象即可,同时可以主动清理Ray分布式存储中的对应对象来释放集群内存,这样就不会出现双倍内存占用的问题。
修正后的代码
def some_func(): # 从Ray分布式存储拉取对象到本地内存 results = ray.get(hash_for_given_job) # 主动通知Ray释放分布式存储中的目标对象(加速集群内存回收,可选) ray.internal.free([hash_for_given_job]) # 直接返回本地对象,内存中仅保留一份实例 return results
关键说明
- 无需深拷贝:
ray.get已经将分布式对象拉取到本地内存,返回这个对象本身就可以让调用者获取到数据,深拷贝完全是多余的操作,会额外占用一倍内存。 - 清理分布式存储对象:如果担心Ray集群的分布式存储还占用该对象的内存,可以调用
ray.internal.free主动删除对应ObjectRef的分布式实例,避免集群层面的内存浪费。 - 本地引用的自动回收:函数执行完毕后,本地变量
results会超出作用域,Python的垃圾回收机制会自动处理该引用,不需要额外执行del results;而返回的对象会被调用者持有,不会被回收。
注意事项
hash_for_given_job需要是有效的Ray ObjectRef,ray.internal.free接受ObjectRef的列表作为参数。- 若使用较新版本的Ray,也可以尝试
ray.delete(hash_for_given_job)来替代ray.internal.free,具体以对应版本的Ray官方说明为准。
内容的提问来源于stack exchange,提问作者Daniel Wiczew
相关产品推荐
相关产品推荐

