Python многопроцессорная обработка с порождением: могу ли я получить дружественный указателю памяти указатель из * любого * numpy массива? - PullRequest
0 голосов
/ 26 февраля 2020

Я пытаюсь найти способ получить дружественный указателю указатель для любого массива numpy, который можно использовать с методом запуска spawn в многопроцессорной обработке Python. В идеале это можно сделать, не зная, был ли этот массив создан из общей памяти или нет. Кажется, просто! Но наступило несколько дней поиска и взлома dry.

Для разветвленных процессов механизм numpy.ctypeslib.as_ctypes отлично работает независимо от того, идет ли ndarray из буфера общей памяти (то есть mp.sharedctypes.Array или аналогичного) или обычная память. Этот указатель быстро разделяется, и каждый процесс может восстановить ndarray, используя np.frombuffer. Это основа большого ответа jfs здесь , который я использовал в течение долгого времени.

В порожденных процессах непосредственная проблема заключается в том, что указатель as_ctypes не является засоленным ( и не ndarray.data представление памяти).

Насколько я понимаю, единственный тип указателя, который можно выбрать при инициализации пула, это простой mp.sharedctypes.Array (как в этот ответ ) ,

Мой вопрос как получить указатель на рассол из любого произвольного ndarray после факта , а-ля as_ctypes? Я немного заблудился, пытаясь смоделировать mp.sharedctypes.Array из существующего обзора памяти, но, возможно, эта идея оправдалась.

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

Я думаю, что новая функция shared_memory.SharedMemory в Py3.8 может решить эту проблему, но я хотел бы знать, есть ли хорошая метод для более старых версий.

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