Модель как параметр функции r, при вызове функции r с использованием rpy2 из многопоточности

Это скорее проблема эффективности при вызове r функций с использованием rpy2 из многопоточности.

Задача функций r в основном загружает файл модели с диска и использует модель для классификации временных рядов. Однако сбор входных временных рядов осуществляется с помощью python путем опроса из базы данных (которая будет обновляться некоторыми веб-сервисами). Как только код Python обнаружит новый временной ряд, он создаст рабочий процесс, где rpy2 используется для вызова функций r для выполнения задачи классификации.

Пусть python выполняет задачу классификации НЕ для нас. Мое главное беспокойство - накладные расходы при загрузке файла модели. Ясно, что я НЕ хочу, чтобы файл читался один раз каждый раз, когда классифицируется новый временной ряд. Так что вопрос -

Как я могу загрузить файл модели только один раз, и объект модели в памяти может быть повторно использован при вызове той же самой функции r через rpy2?

Мое первоначальное намерение - загрузить файл модели в python и передавать его в качестве параметра каждый раз, когда вызывается функция r. Но это приведет к дополнительным затратам на копирование параметров модели (скажем, размер не является незначительным).

Ваша помощь будет очень признательна!

1 ответ

Решение

Если я правильно понимаю, вы:

  1. иметь функцию (классификатор), написанную на R, которая требует относительно большой объем данных для работы (k ближайших соседей?)
  2. загружают этот массив данных с помощью Python
  3. хотел бы загрузить параметры / один раз / и после этого сделать столько обращений к классификатору, сколько требуется
  4. планировать передачу тела данных в качестве параметра для классификатора

Если следует 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?

Другие вопросы по тегам