如何在 Ray 中与多人共享内存

问题描述

我在 linux 上工作,使用 python 3.8.5,这是我的代码

oaglog.logger.info("begin to read graph。。。")
graph = renamed_load(open(os.path.join(ABSULUTE_DIR + args.data_dir,'graph%s.pk' % args.domain),'rb'))
oaglog.logger.info("read graph successed。")

ray_graph = ray.put(graph)

@ray.remote
class Counter(object):
    def __init__(self,a):
        self.n = 0
        self.a = a
    def increment(self):
        self.n += 1

    def read(self,b,m_graph):
        print("a")
        self.increment()
        print(id(m_graph))
        del m_graph
        return self.n * b

counters = [Counter.remote(a=0) for i in range(8)]
futures = [c.read.remote(2,ray_graph) for c in counters]

print('******************************')
print(ray.get(futures))

因为图很大(大约9Gb),所以我想把它放到共享内存中,我尝试了ray.put(),但是失败了,图被复制了8次,我想知道Ray是否提供了替代方案解决方案?

解决方法

图形被复制是因为它是一个任意的 python 对象,并且被复制是因为你的每个演员都可能试图修改他们的副本。

Ray 能够避免为某些类型的 objects which can be loaded in a read-only way 复制 Python 对象。

如果您可以将图形表示为一个 numpy 数组,它会自动作为只读 numpy 数组加载到您的每个 actor 中,并且不会被复制。

您也可以自己为您的对象实施带外泡菜反序列化,which is a bit more tricky