Модель как параметр функции r, при вызове функции r с использованием rpy2 из многопоточности
Это скорее проблема эффективности при вызове r функций с использованием rpy2 из многопоточности.
Задача функций r в основном загружает файл модели с диска и использует модель для классификации временных рядов. Однако сбор входных временных рядов осуществляется с помощью python путем опроса из базы данных (которая будет обновляться некоторыми веб-сервисами). Как только код Python обнаружит новый временной ряд, он создаст рабочий процесс, где rpy2 используется для вызова функций r для выполнения задачи классификации.
Пусть python выполняет задачу классификации НЕ для нас. Мое главное беспокойство - накладные расходы при загрузке файла модели. Ясно, что я НЕ хочу, чтобы файл читался один раз каждый раз, когда классифицируется новый временной ряд. Так что вопрос -
Как я могу загрузить файл модели только один раз, и объект модели в памяти может быть повторно использован при вызове той же самой функции r через rpy2?
Мое первоначальное намерение - загрузить файл модели в python и передавать его в качестве параметра каждый раз, когда вызывается функция r. Но это приведет к дополнительным затратам на копирование параметров модели (скажем, размер не является незначительным).
Ваша помощь будет очень признательна!
1 ответ
Если я правильно понимаю, вы:
- иметь функцию (классификатор), написанную на R, которая требует относительно большой объем данных для работы (k ближайших соседей?)
- загружают этот массив данных с помощью Python
- хотел бы загрузить параметры / один раз / и после этого сделать столько обращений к классификатору, сколько требуется
- планировать передачу тела данных в качестве параметра для классификатора
Если следует 4., копирование не всегда необходимо, но в настоящее время только в том случае, если данные являются числовыми или логическими, а область памяти выделяется R.
Однако я думаю, что более простой альтернативой для такой ситуации является передача массива данных раз в R (и, при необходимости, их копирование) и использование этого преобразованного объекта.
from rpy2.robjects.packages import importr
e1071 = importr('e1071')
from rpy2.robjects.conversion import py2ri
# your model's data are in 'm_data'
# here conversion is happening
r_m_data = py2ri(m_data)
for test_data in many_test_data:
# r_m_data is already a pointer to an R data structure
# (it was converted above - no further copying is made)
res = e1071.knn(r_m_data, test_data)
Это будет соответствовать тому, что вы описываете как:
Как я могу загрузить файл модели только один раз, и объект модели в памяти может быть повторно использован при вызове той же самой функции r через rpy2?