Делитесь массивами scipy.sparse с нулевым копированием в Python Ray

Я передаю большие массивы scipy.sparse в параллельные процессы в общей памяти одного вычислительного узла. В каждом раунде параллельных заданий переданный массив не будет изменен. Я хочу передать массив с нулевой копией.

Хотя это возможно с помощью multiprocessing.RawArray() и numpy.sharedmem (см. здесь), мне интересно, как ray's put() работает.

Насколько я понял (см. управление памятью, [1], [2]), метод ray put() копирует объект один раз и навсегда ( сериализовать, а затем десериализовать) в хранилище объектов, доступное для всех процессов.

Вопрос:

Я не уверен, что правильно понял, это глубокая копия всего массива в хранилище объектов или просто ссылка на него? Есть ли способ вообще не копировать объект? Скорее просто передать адрес/ссылку существующего массива scipy? По сути, настоящая неглубокая копия без накладных расходов на копирование всего массива.


Ubuntu 16.04, Python 3.7.6, Ray 0.8.5.


person Sia    schedule 22.05.2020    source источник
comment
Это также может быть полезно для понимания того, как работает чтение с нулевым копированием docs.ray.io/en/master/   -  person Sang    schedule 23.05.2020
comment
scipy.sparse матрица не является подклассом ndarray. Это пользовательский класс Python, или, скорее, классы. Разные форматы имеют разные классы и атрибуты хранения данных. Один на самом деле является подклассом словаря, другие хранят данные (и индексы) в нескольких ndarrays.   -  person hpaulj    schedule 23.05.2020
comment
@hpaulj это не проблема, я могу передавать компоненты разреженного массива scipy, такие как ненулевые данные и их индексы, как ndarray.   -  person Sia    schedule 23.05.2020