设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客
LUPA开源社区 首页 业界资讯 技术文摘 查看内容

一个简单并行运行R的方法

2015-1-30 15:47| 发布者: joejoe0332| 查看: 820| 评论: 0|原作者: yhathq|来自: CSDN

摘要: 也许很多人对R都是既爱又恨。而人们常见的一个争论的主题就是并行计算,换一种更直接的说法:“当耗尽内存的时候我该如何在R中处理数据?”

  也许很多人对R都是既爱又恨。而人们常见的一个争论的主题就是并行计算,换一种更直接的说法:“当耗尽内存的时候我该如何在R中处理数据?”




  不必担心,实际上在R中有一些简易的方式去使用并行包!在这里也为大家介绍了一种:


选择一个库

首先做的事情是,你需要选择一个并行计算方案。在这里以doMC和plyr作为测试组合。


配置环境

当挑选完库之后,我们需要加载它们。导入之后,我们实际上需要“告诉”doMC我们机器上有多少核是可以使用的。要做到这一点可参考以下代码:

library(plyr)
library(doMC)
doMC::registerDoMC(cores=32) # or however many cores you have access to

如果你紧接着链接ec2instances.info时,你会发现32核等同于“104个ec2计算单位”


处理数据

接下来,我们需要使用plyr来执行数据处理。plyr将自动的使用多核。这里你不需要用到doMC。

举个简单的例子来说,使用ddply函数来处理iris数据集,功能将暂停2秒。由于iris有三种类型,所以该命令将花费6秒。

system.time(ddply(iris, .(Species), function(x) {
    Sys.sleep(2)
    nrow(x)
}))
#    user  system elapsed
#   0.005   0.001   6.016

不过当你向ddply中添加.parallel = TRUE时,你发现了什么?

system.time(ddply(iris, .(Species), function(x) {
    Sys.sleep(2)
    nrow(x)
}, .parallel = TRUE))
#    user  system elapsed
#   0.018   0.015   2.031

正如结果所显示的那样,时间缩短为2秒。这意味着我们在同一时间内处理了iris的三个种类。而在plyr中,几乎所有的功能都有.parallel选项。

接下来我们再用雅虎搜索市场广告竞价数据集来测试一下,读取它并通过phrase_id和account_id对它进行划分:

headers <- c("timestamp", "phrase_id", "account_id", "price", "auto")
df <- read.table("./ydata-ysm-advertiser-bids-v1_0.txt")
colnames(df) <- headers
system.time(ddply(df, .(phrase_id, account_id), function(x) {
    data.frame(mean=mean(x$price, na.rm=T), median=median(x$price, na.rm=T))
    nrow(x)
}))
# user  system elapsed 
# 96.645   3.343  99.964

当我们使用并行处理相同的代码时,我们可以看到只有48.5秒:

system.time(ddply(df, .(phrase_id, account_id), function(x) {
    data.frame(mean=mean(x$price, na.rm=T), median=median(x$price, na.rm=T))
    nrow(x)
}, .parallel = TRUE))
#   user  system elapsed 
# 94.228  16.267  48.553

最后

并行计算并没有想的那么困难和复杂,在R中保持并行的简单性可以让你不那么“头痛”。这里也列举了其他好的并行处理R包的方法。感兴趣的可以点击查看:

原文来自:yhathq


酷毙

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部