我正在使用大型数据集,并尝试将其卸载到Amazon EC2以便更快地处理。
数据从两个表开始 - 6.5M x 6和11K x 15.然后我将它们合并到一个6.5M x 20表中。
这是我的R代码:
library(data.table)
library(dplyr)
download.file("http://d396qusza40orc.cloudfront.net/exdata%2Fdata%2FNEI_data.zip", "data.zip")
unzip("data.zip")
data <- readRDS("summarySCC_PM25.rds")
scckey <- readRDS("Source_Classification_Code.rds")
system.time(data <- data %>% inner_join(scckey))
在我的家用笔记本电脑(i7 1.9GHZ,8GB RAM,SSD)上,这是我的输出
user system elapsed
226.91 0.36 228.39
在Amazon EC2 c4.8xlarge上(36个vCPU,132个EPU,60个RAM,EBS存储)
user system elapsed
302.016 0.396 302.422
在Amazon EC2 c3.8large上(32个vCPU,108个EPU,60GB RAM,SSD存储)
user system elapsed
374.839 0.367 375.178
两个EC2系统如何比我自己的笔记本电脑慢?特别是c4.8larlar似乎是亚马逊提供的最强大的计算解决方案。
我做错了吗?
编辑:
我已经检查了监控系统 - 看起来连接运行的CPU使用率为3-5%。这似乎非常低 - 在我的笔记本电脑上它运行大约30-40%。
编辑:
根据我的建议,我尝试了data.table
&#39; merge()
3.8xlarge @ ~1%CPU利用率:
system.time(datamerge <- merge(data, scckey, by = "SCC"))
user system elapsed
193.012 0.658 193.654
4.8xlarge @ ~2%CPU利用率:
system.time(datamerge <- merge(data, scckey, by = "SCC"))
user system elapsed
162.829 0.822 163.638
笔记本:
最初需要5分钟以上,所以我重新启动了R。
system.time(datamerge <- merge(data, scckey, by = "SCC"))
user system elapsed
133.45 1.34 135.81
这显然是一种更有效的功能,但我还是以不错的优势击败了最好的亚马逊EC2机器。
编辑:
scckey[data]
会将此操作的时间缩短至小于1秒的笔记本电脑。我仍然很好奇如何更好地利用EC2。
答案 0 :(得分:3)
并非我是Amazon EC2的专家,但它可能使用商用服务器作为基础硬件平台。 &#34;商品&#34;在这种情况下意味着x86 CPU,它们具有与笔记本电脑相同的基本架构。根据笔记本电脑的强大程度,它甚至可能比EC2实例中的内核具有更高的时钟速度。
EC2为您提供的是可伸缩性,这意味着比您本地更多的内核和内存。但是必须编写代码才能利用这些内核;意味着它必须在执行中并行化。我非常确定data.table
像几乎所有R软件包一样是单线程的,因此获得更多内核不会让自己更快地完成任务。此外,如果您的数据已经适合您的记忆,那么获得更多数据并不会产生显着的收益。