我正在处理一个大型数据集,并试图将其卸载到Amazon以获得更快的处理速度。
数据从两个表开始-- 6.5M×6和11K×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,8GBRAM,SSD)上,这是我的输出
user system elapsed
226.91 0.36 228.39 在亚马逊EC2 c4.8xlarge上(36 vCPU,132 EPU,60 EBS内存,EBS存储器)
user system elapsed
302.016 0.396 302.422 亚马逊EC2 c3.8大(32 vCPU,108 EPU,60 an内存,SSD存储器)
user system elapsed
374.839 0.367 375.178这两个EC2系统怎么会比我自己的笔记本电脑慢呢?尤其是c4.8,似乎是亚马逊提供的最强大的计算解决方案。
我做错了什么吗?
编辑:
我检查了监视系统-它看起来连接运行在3-5%的CPU使用率。这似乎很低--在我的笔记本电脑上,它的运行速度在30-40%左右。
编辑:
根据建议,我尝试了data.table的merge()。
3.8xlarge @ ~1% CPU利用率:
system.time(datamerge <- merge(data, scckey, by = "SCC"))
user system elapsed
193.012 0.658 193.6544.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。
发布于 2015-04-25 23:43:55
这并不是说我是亚马逊EC2的专家,但它可能使用商品服务器作为基本的硬件平台。在这个上下文中,“初级商品”指的是x86 CPU,它具有与您的笔记本电脑相同的基本架构。取决于笔记本电脑的功能,它甚至可能比EC2实例中的内核具有更高的时钟速度。
EC2给您带来的是可伸缩性,这意味着比本地拥有更多的核心和内存。但是您的代码必须编写才能利用这些核心;这意味着它必须在执行过程中被并行化。我很确定data.table是单线程的,就像几乎所有的R包一样,所以拥有更多的内核不会让事情变得更快。而且,如果您的数据已经在您的内存中,那么获得更多将不会产生显著的收益。
https://stackoverflow.com/questions/29870825
复制相似问题