Python-Rpy-R数据处理优化
我正在用Python和R编写一个数据处理程序,并用Rpy2桥接 输入数据是二进制的,我使用Python读取数据并将其传递给R,然后收集结果以输出 数据被组织成块,每个块大约有100字节(每个值1字节*100个值) 他们现在刚开始工作,但速度很慢。以下是我对1GB大小(即10^7条)数据的一些测试: 如果我禁用Rpy2调用来进行一次试运行,Python使用一个线程在3.06GHz的Intel(R)Xeon(TM)CPU上循环大约需要90分钟 如果我在Xeon双核上启用完整功能和多线程,程序(估计)需要约200小时才能完成 我多次终止Python程序,调用堆栈几乎总是指向Rpy2函数接口。我还做了分析,得出了类似的结果 所有这些观察结果表明,Rpy2调用的R部分是瓶颈。因此,我分析了我的R程序的一个独立版本,但分析摘要指向“匿名”。我仍在努力寻找我的R脚本中最耗时的部分****已更新,请参见下面的“我的编辑”***** 有两种可疑的候选方法,一种是使用cran[1]中的wmtsa进行的连续小波变换(CWT)和小波变换模极大值(WTMM),另一种是非高斯曲线的非线性拟合 我想到的是:Python-Rpy-R数据处理优化,python,r,rpy2,Python,R,Rpy2,我正在用Python和R编写一个数据处理程序,并用Rpy2桥接 输入数据是二进制的,我使用Python读取数据并将其传递给R,然后收集结果以输出 数据被组织成块,每个块大约有100字节(每个值1字节*100个值) 他们现在刚开始工作,但速度很慢。以下是我对1GB大小(即10^7条)数据的一些测试: 如果我禁用Rpy2调用来进行一次试运行,Python使用一个线程在3.06GHz的Intel(R)Xeon(TM)CPU上循环大约需要90分钟 如果我在Xeon双核上启用完整功能和多线程,程序(估计)
W <- wavCWT(s,wavelet="gaussian1",variance=1/p) # 1/4
W.tree <-wavCWTTree(W) # 1/2
holderSpectrum(W.tree) # 1/4
其中,从gamlss.dist包中计算dexGAUS需要花费大部分时间
剩余约10%的R时间用于数据传递/拆分/聚合/子集。对于选项3。。高效地获取您的数据。。。在python中以一个长str类型从文件中读取所有内容。让我们假设它叫做myStr
import array
myNums = array.array('B', myStr)
现在myNums是每个字节的数组,可以轻松转换。。。请参阅帮助(array.array)。。。事实上,从这个角度看,您可以通过数组直接从文件中获取它
这样就可以省去1.4小时的数据读取时间。我的理解是,您有:
- 在某些地方使用rpy2的python代码
- 可追溯到对rpy2的调用的性能问题
- 性能问题目前似乎与rpy2本身没有多大关系,因为底层R主要负责运行时间
- R代码的一部分是一次读取一个字节并将它们附加到列表中,通过将该部分移动到Python中,您可以改进该列表
- 用于读取字节的缓冲策略(正如John已经回答的)
- 努力优化你的R代码
- 考虑琐碎的并行化(并最终在云上租用计算空间)
import array
myNums = array.array('B', myStr)