Я пытаюсь найти способ получить дружественный указателю указатель для любого массива 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 может решить эту проблему, но я хотел бы знать, есть ли хорошая метод для более старых версий.