R - 高性能 Amazon EC2 比 i7 慢?
R - High performance Amazon EC2 slower than i7?
我正在处理一个大型数据集,并尝试将其卸载到 Amazon EC2 以加快处理速度。
数据以两个 tables - 6.5M x 6 和 11K x 15 开始。然后我将它们合并为一个 6.5M x 20 table.
这是我的 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、60GB 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.8large 似乎是亚马逊提供的最强大的计算解决方案。
我是不是做错了什么?
编辑:
我检查了监控系统 - 看起来连接 运行 在 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.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
这显然是一个更高效的函数,但我仍然以可观的优势击败了最好的 Amazon EC2 机器。
编辑:
scckey[data]
在我的笔记本电脑上 将此操作的时间减少到 不到 1 秒 。我仍然很好奇如何更好地利用 EC2。
并不是说我是 Amazon EC2 的专家,但它可能使用商用服务器作为基础硬件平台。 "Commodity" 在此上下文中表示 x86 CPU,其基本架构与您的笔记本电脑相同。根据您的笔记本电脑的强大程度,它甚至可能具有比 EC2 实例中的内核更高的时钟速度。
EC2 为您带来的是可扩展性,这意味着比您在本地拥有的内核和内存更多。但是您必须编写代码以利用这些核心;这意味着它必须在执行中并行化。我很确定 data.table
像几乎所有 R 程序包一样是单线程的,因此获得更多内核本身并不能使事情变得更快。此外,如果您的数据已经适合您的记忆,那么获取更多数据不会产生显着的收益。
我正在处理一个大型数据集,并尝试将其卸载到 Amazon EC2 以加快处理速度。
数据以两个 tables - 6.5M x 6 和 11K x 15 开始。然后我将它们合并为一个 6.5M x 20 table.
这是我的 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、60GB 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.8large 似乎是亚马逊提供的最强大的计算解决方案。
我是不是做错了什么?
编辑:
我检查了监控系统 - 看起来连接 运行 在 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.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
这显然是一个更高效的函数,但我仍然以可观的优势击败了最好的 Amazon EC2 机器。
编辑:
scckey[data]
在我的笔记本电脑上 将此操作的时间减少到 不到 1 秒 。我仍然很好奇如何更好地利用 EC2。
并不是说我是 Amazon EC2 的专家,但它可能使用商用服务器作为基础硬件平台。 "Commodity" 在此上下文中表示 x86 CPU,其基本架构与您的笔记本电脑相同。根据您的笔记本电脑的强大程度,它甚至可能具有比 EC2 实例中的内核更高的时钟速度。
EC2 为您带来的是可扩展性,这意味着比您在本地拥有的内核和内存更多。但是您必须编写代码以利用这些核心;这意味着它必须在执行中并行化。我很确定 data.table
像几乎所有 R 程序包一样是单线程的,因此获得更多内核本身并不能使事情变得更快。此外,如果您的数据已经适合您的记忆,那么获取更多数据不会产生显着的收益。