如何最大化本机R脚本的性能(将运行数千次)?

时间:2013-05-14 18:17:51

标签: performance r jit processing-efficiency

我正在尝试对同一模拟数据集上的几个统计测试进行蛮力的头对头比较。我将产生数千个“控制”和数千个“实验”群体,并在每组上运行相同的测试。调用测试的包装器将被调用数千次。

我的问题是:

  1. 以下计划是否合适?
  2. 你能想出任何方法来提高速度吗(不重写本机R函数,虽然我可以复制其内部代码的子集并运行它而不是整个函数)?
  3. 计划

    我已经有模拟人口,并将使用适当的应用函数将控件和相应的实验观察结果传递给包装器。

    除了控件和实验观察之外,包装器没有任何参数(我们称之为xxyy)。其他所有内容都将在包装器中进行硬编码,以尽可能避免流控制逻辑的开销和在环境之间复制数据。

    要调用的每个函数将按照一致的格式按照依赖顺序排列在单独的行上(例如,cox.zph取决于已存在coxph个对象的意义,因此coxph()将早于cox.zph()调用。这些函数将被包装在try()中,如果函数失败,输出和依赖它的函数首先测试它返回的对象是否为try-error作为其第一个类,如果是,则为某种类占位符值。

    被调用函数块后面将跟一个长c()语句,每个项目从一个单独的行中的相应拟合对象中提取。在这里,如果源对象变为try-error或占位符,则在该输出槽中放置NA

    这样,如果某些函数失败,整个运行不会中止,并且每个模拟的输出都是相同长度的数字向量,适合捕获到矩阵。

    根据一组给定模拟的目标,我可以根据需要注释掉或插入其他测试和结果。

    几个更具体的后续问题

    1. 如果我已经在使用compilePKGS(T)enableJIT(3)(来自内置的compiler库),那么通过手动运行compile()还是可以获得更多信息我的包装函数上的cmpfun()和它调用的解释函数?
    2. 是否有人对选择最佳enableJIT()价值有任何指导,或者如果我不关心启动时间,是“越多越好”?
    3. 如果每个模拟都是一个新的随机变量,那么我没有什么可以从记忆中获益,对吗?
    4. 对于长时间运行的任务,我喜欢检查内部函数以查看是否存在给定名称的文件,如果存在,则将其发送到其环境中。这允许我动态地重新获得对会话的控制来修复问题,运行browser(),保存内部对象等,而不必中止整个运行。但是,我想,ping通常会开始加起来的文件系统。有没有就最有效的方式将一个布尔值(即调试脚本的来源,或者不是)传递给正在运行的R进程(在Linux下)?
    5. 感谢。

1 个答案:

答案 0 :(得分:3)

这可能只会解决部分问题。我也很幸运,通过避免应用功能来加速进程。 apply不是矢量化的,实际上需要花费很多时间。我使用嵌套的ifelse()语句看到了收益。

你试过Rprof()吗?在我的情况下,识别代码的慢速元素非常有用。不是解决方案本身,而是一种有用的诊断。