Общий Numpy массив несмежного доступа - PullRequest
5 голосов
/ 15 декабря 2011

У меня есть пустой массив, который я хотел бы разделить между несколькими процессами Python таким образом, чтобы не использовать копии. Я создаю общий массив NumPy из существующего массива NUMPY, используя пакет sharedmem .

import sharedmem as shm
def convert_to_shared_array(A):
    shared_array = shm.shared_empty(A.shape, A.dtype, order="C")
    shared_array[...] = A
    return shared_array

Моя проблема заключается в том, что каждому подпроцессу требуется доступ к строкам, которые случайно распределены в массиве. В настоящее время я создаю общий массив numpy с помощью пакета sharedmem и передаю его каждому подпроцессу. У каждого процесса также есть список idx строк, к которым он должен получить доступ. Проблема в подпроцессе, когда я делаю:

#idx = list of randomly distributed integers

local_array = shared_array[idx,:]

# Do stuff with local array

Создает копию массива, а не просто другое представление. Массив довольно большой и манипулирует им в первую очередь, прежде чем делиться им, так что каждый процесс получает доступ к непрерывному диапазону строк, например

local_array = shared_array[start:stop,:]

занимает слишком много времени.

Вопрос: Каковы хорошие решения для совместного использования произвольного доступа к пустому массиву между процессами python, которые не включают копирование массива?

Подпроцессам необходим доступ только для чтения (поэтому нет необходимости блокировать доступ).

1 Ответ

1 голос
/ 03 января 2012

Причудливая индексация приводит к созданию копии, поэтому вам следует избегать пристрастной индексации, если вы хотите избежать копирования, у вас нет пути ее обойти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...