Python Rpy R数据处理优化

时间:2010-07-14 01:00:42

标签: python r rpy2

我正在用Python和R编写一个数据处理程序,与Rpy2桥接。

输入数据是二进制的,我使用Python读取数据并将它们传递给R,然后收集结果输出。

数据被分成几个部分,每个部分大约100字节(每个值为1Byte * 100个值)。

他们现在只是工作,但速度非常低。以下是我对1GB大小(即10 ^ 7件)数据的测试:

如果我禁用Rpy2调用以进行干运行,则需要大约90分钟才能使用单个线程在Intel(R)Xeon(TM)CPU 3.06GHz上循环。

如果我在该Xeon双核上启用全功能和多线程,它(将通过估算)需要约200小时才能完成该程序。

我几次杀死了Python程序,调用堆栈几乎是指向Rpy2函数接口的alwarys。我也进行了剖析,得到了类似的结果。

所有这些观察结果表明Rpy2调用的R部分是瓶颈。所以我描述了我的R程序的独立版本,但分析摘要指向“匿名”。我仍然在努力查看我的R脚本的哪一部分是最耗时的部分。 ****已更新,请参阅下面的编辑*****

有两个可疑候选者,一个是连续小波变换(CWT)和小波变换模极大值(WTMM),使用来自cran [1]的wmtsa,另一个是ex-gaussion曲线的非线性拟合。 / p>

我想到的是:

  1. 为了拟合,我可以用内联C代码替换R路由? C和fortran有许多拟合图书馆......(网上的想法;我从来没有这样做;不确定)

  2. 对于小波算法....我必须分析wmtsa包来重写C中的热点? ....使用C或fortran重新实现整个wmtsa包对我来说非常重要。我的编程经验不多。

  3. 文件中的数据块是按20个连续的字节组织的,我可以直接映射到类似C的char *数组?目前我的Python程序一次只读一个字节并将其附加到列表中,这很慢。这部分代码需要1.5小时而R需要约200小时,所以不是那么紧急。

  4. 这是我第一次在解决实际问题时达到计划效率。我STFW并感到信息不堪重负。请给我一些建议,了解下一步该怎么做以及如何做。

    干杯!

    脚注:

    1. http://cran.r-project.org/web/packages/wmtsa/index.html
    2. *更新*

      感谢来自cran的proftools,我设法创建了一个调用堆栈图。我可以看到〜%56%的时间花在了wmtsa上,代码片段就像:

      W <- wavCWT(s,wavelet="gaussian1",variance=1/p) # 1/4
      W.tree <-wavCWTTree(W) # 1/2
      holderSpectrum(W.tree) # 1/4
      

      约有28%的时间花在了nls上:

      nls(y ~ Q * dexGAUS(x, m, abs(s), abs(n)) + B, start = list(Q = 1000, m = h$time[i], s = 3, n = 8, B = 0), algorithm="default", trace=FALSE)
      

      从gamlss.dist包中评估dexGAUS需要大部分时间。

      剩余约10%的R时间用于数据传递/分割/聚合/子集。

2 个答案:

答案 0 :(得分:1)

对于选项3 ...有效地获取数据...在python中以一个长str类型读取它,只需从文件中读取一次。我们假设它叫做myStr。

import array
myNums = array.array('B', myStr)

现在myNums是一个容易转换的每个字节的数组...请参阅help(array.array)...实际上,看起来你可以直接从文件中通过数组获取它。 / p>

这应该可以消除1.4小时的数据读取。

答案 1 :(得分:1)

我的理解是你有:

  • 在地方使用rpy2的python代码

  • 可以跟踪调用rpy2的性能问题

  • 性能问题目前似乎与rpy2本身无关,因为底层R主要负责运行时间

  • 你的R代码的一部分是一次读取一个字节并将它们附加到列表中,通过将该部分移动到Python来改进它

在没有看到实际代码的情况下尝试帮助有点难,您可能需要考虑:

  • 用于读取字节的缓冲策略(因为John已经回答了这个问题)。

  • 致力于优化您的R代码

  • 考虑平凡的并行化(并最终在云上租用计算空间)