Совместное использование разреженного массива SciPy между объектами процесса

Недавно я изучал многопроцессорную обработку Python и столкнулся с препятствием. У меня есть большой разреженный массив SciPy (формат CSC), который мне нужно разделить в формате только для чтения между 5 рабочими процессами. Я прочитал это и this (numpy-shared), но, похоже, это только для плотных типов.

Как бы я мог поделиться scipy.sparse.csc_matrix() без копирования (или с минимальным копированием) между 5 многопроцессорными объектами Process? Кажется, что даже метод numpy-shared требует копирования всего массива, и даже тогда я не могу просто преобразовать scipy.sparse в mp.Array(). Может ли кто-нибудь помочь указать мне правильное направление?

Спасибо!


person Will    schedule 16.07.2013    source источник


Ответы (1)


Я не могу помочь вам с многопроцессорной частью вашего вопроса, но разреженная матрица CSC представляет собой немногим больше трех массивов numpy. Вы можете создать другую разреженную матрицу b, совместно использующую те же объекты памяти, что и разреженная матрица a, выполнив следующие действия:

import scipy.sparse as sps

b = sps.csc_matrix((a.data, a.indices, a.indptr), shape=a.shape, copy=False)

a.data, a.indices и a.indptr — это три пустых массива, которыми вы хотите поделиться между своими процессами. Если вы можете это сделать, то создание разреженной матрицы в каждом процессе будет недорогой операцией.

person Jaime    schedule 16.07.2013
comment
Ах, круто. Он не будет делать копии во время построения csc_matrix()? - person Will; 17.07.2013
comment
Если вы не укажете copy=True, этого не должно быть. - person Jaime; 17.07.2013