#parallel-processing #shared-memory #actor #multiprocess #ray
#параллельная обработка #разделяемая память #актер #многопроцессорный #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))
Поскольку график огромен (около 9 ГБ), поэтому я хочу поместить его в общую память, я попробовал ray.put() , но это не удалось, график был скопирован 8 раз, мне было интересно, предлагает ли Ray альтернативное решение?
Ответ №1:
График копируется, потому что это произвольный объект python, и копируется, потому что каждый из ваших участников может попытаться изменить его копию.
Ray может избежать копирования объектов python для определенных типов объектов, которые могут быть загружены только для чтения.
Если вы можете представить свой график в виде массива numpy, он будет автоматически загружен как доступный только для чтения массив numpy в каждом из ваших участников и не будет скопирован.
Вы также можете самостоятельно реализовать внеполосную десериализацию pickle для своего объекта, что немного сложнее.