0

当从多线程中使用 rpy2 调用 r 函数时,这更像是一个效率问题。

r 函数的任务基本上是从磁盘加载模型文件并使用模型对时间序列进行分类。然而,收集输入时间序列是使用 python 通过从数据库中轮询来完成的(将由一些 Web 服务更新)。一旦python代码检测到新的时间序列,它将创建一个工作进程,其中rpy2用于调用r函数来完成分类任务。

让 python 做分类任务不是我们的选择。我主要关心的是加载模型文件时的开销。显然,我不希望每次对新的时间序列进行分类时都读取一次文件。所以问题是——

如何只加载一次模型文件,并且当通过 rpy2 调用相同的 r 函数时可以重新使用内存中的模型对象?

我最初的意图是将模型文件加载到 python 中,并在每次调用 r 函数时将其作为参数传递。但这会引入复制模型参数的额外成本(比如大小不可忽略)。

您的帮助将不胜感激!

4

1 回答 1

1

如果我理解正确,您:

  1. 有一个用 R 编写的函数(分类器),它需要相对大量的数据才能工作(k 个最近的邻居?)
  2. 正在使用 Python 加载该数据体
  3. 想加载参数/once/,然后根据需要对分类器进行尽可能多的调用
  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)

这将对应于您所描述的内容:

如何只加载一次模型文件,并且当通过 rpy2 调用相同的 r 函数时可以重新使用内存中的模型对象?

于 2013-03-29T12:45:39.347 回答