当使用多线程中的rpy2调用r函数时,模型作为r函数的参数

时间:2013-03-28 20:42:10

标签: python multithreading r multiprocessing rpy2

当使用来自多线程的rpy2调用r函数时,这更是一个效率问题。

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

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

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

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

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

如果我理解正确,你:

  1. 有一个用R编写的函数(分类器)需要相对较大的数据体才能工作(k个最近邻居?)
  2. 正在使用Python
  3. 加载该数据主体
  4. 想要加载参数/一次/之后,根据需要调用分类器
  5. 计划传递数据主体作为分类器的参数
  6. 如果遵循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函数时?