Python-Rpy-R数据处理优化

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双核上启用完整功能和多线程,程序(估计)

我正在用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),另一种是非高斯曲线的非线性拟合

我想到的是:

  • 对于配件,我可以用内联C代码代替R布线?在C和fortran中有许多可用的配件库。。。(来自网络的想法;我从未这样做过;不确定)

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

  • 文件中的数据段以20个连续字节组织,我可以直接映射到一个类似C的char*数组?目前,我的Python程序一次只读取一个字节,然后将其附加到列表中,速度很慢。这部分代码需要1.5小时,而R大约需要200小时,所以没有那么紧急

  • 这是我第一次在解决实际问题时遇到程序效率问题。我感到震惊,被这些信息淹没了。请给我一些关于下一步做什么和如何做的建议

    干杯

    脚注:

  • *更新*

    多亏了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
    
    其中,从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代码

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


    您需要提供更多细节,也许是您认为R代码可疑区域的片段。在这一点上,您的问题有太多可能的解决方案。但有一件事是,你可能不得不接受你所做的事情需要一段时间。例如,选项1,配件,在R中通常(同样,没有足够的细节)高度优化。以其他方式不太可能更快。非常感谢John。我已经更新了我的帖子。请看一看:看看你那里有什么。。那只是需要很长时间。如果有地方可以加快你的节奏,你可能会想看看约翰,你的意思是说只有很少的空间可以加快?我已经检查了小波函数,它们已经在C.BTW中实现了,这是一本很棒的书。如果你的R调用不是多次的,并且是独立的方式(在这种情况下,你可以考虑一个琐碎的并行化),你就真的留下了:-研究算法并尝试优化它们。(dexGAUS占用了大部分28%的运行时间,我认为这有点令人担忧——你是在循环内部调用它,不是吗?)-改变方法,然后当我更仔细地阅读你的问题时,看起来你没有要求python做任何不能完全在R中完成的事情。那么,为什么要使用python代码呢?我只是不知道如何在R中处理高度定制的数据。我在数据文件的描述区域使用python进行词法分析。嗨,lgautier,你的理解是对的,除了第四点:我用Python从二进制文件中读取数据,然后通过Rpy将它们传递给R。这种读取策略是逐字节的,没有经过优化。我使用了琐碎的并行化,所花费的时间仍然是不可接受的。我在帖子中有一些关于分析R代码的更新。请看一看:)
    import array
    myNums = array.array('B', myStr)