#python #numpy #multiprocessing #shared-memory
#python #numpy #многопроцессорная обработка #разделяемая память
Вопрос:
Я пытаюсь разделить pandas.DataFrame
процесс между 2 с помощью multiprocessing.shared_memory
module.
Я начал с открытия 2 записных JupyterLab
книжек и написал этот код:
Чтобы иметь возможность использовать 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. Вы могли бы совместно использовать нестроковые столбцы в виде отдельных массивов. Если вы хотите использовать этот фрейм данных как есть, вам следует изучить другие способы межпроцессного взаимодействия.