Общая память между 2 обработанными (приложение разбито)

#python #numpy #multiprocessing #shared-memory

#python #numpy #многопроцессорная обработка #разделяемая память

Вопрос:

Я пытаюсь разделить pandas.DataFrame процесс между 2 с помощью multiprocessing.shared_memory module.

Я начал с открытия 2 записных JupyterLab книжек и написал этот код:

Ноутбук 1

Ноутбук 2

Чтобы иметь возможность использовать copy , и paste я также опубликую код в виде текста:

 # Notebook 1:

from multiprocessing.shared_memory import SharedMemory
import numpy as np
import pandas as pd

values = lambda cast: [cast(value) for value in range(5)]

pd_object = pd.DataFrame(data={'A': values(cast=int), 'B': values(cast=float), 'C': values(cast=str)})
np_object = pd_object.to_numpy(copy=True, dtype='object')

shared_memory = SharedMemory(name='dataframe', create=True, size=np_object.nbytes)
shared_object = np.ndarray(shape=np_object.shape, dtype=np_object.dtype, buffer=shared_memory.buf)

shared_object[:] = np_object
shared_object
# array([[0, 0.0, '0'],
#        [1, 1.0, '1'],
#        [2, 2.0, '2'],
#        [3, 3.0, '3'],
#        [4, 4.0, '4']], dtype=object)

shared_memory.close()
shared_memory.unlink()

# Notebook 2:

from multiprocessing.shared_memory import SharedMemory
import numpy as np
import pandas as pd

shared_memory = SharedMemory(name='dataframe')
shared_object = np.ndarray(shape=(5, 3), dtype=np.object, buffer=shared_memory.buf)

shared_object # here the application crushed without no reason...

pd_object = pd.DataFrame(data=shared_object, columns=['A', 'B', 'C'], dtype='object')
pd_object = pd_object.astype(dtype={'A': 'int64', 'B': 'float64', 'C': 'object'})

shared_memory.close()
  

Проблема в том, что приложение разбито на Notebook 2 то, где я прошу просмотреть выходные shared_object данные, я не знаю, почему это происходит…

Я пытался следовать этой документации

Спасибо всем, кто может помочь!

Ответ №1:

Массивы общей памяти не могут иметь типы объектов. Массивы типов объектов — это массивы указателей — указатели будут полностью недействительными в новой оболочке, и python будет отключен при попытке доступа к ним.

Переключитесь на числовой dtype.

Комментарии:

1. Как я могу поделиться смешанными типами фреймов данных? например, этот пример, который включает (int, float и str)

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