R - 数据处理和可扩展代码
R - data munging and scalable code
嗨,
在过去的几天里,我遇到了一个 small/big 问题。
我有一个交易数据集,有 100 万行和两列(客户 ID 和产品 ID),我想将其转换为二进制矩阵。
我使用了 reshape 和 spread 函数,但在这两种情况下我都使用了 64mb ram 并且 Rstudio/R 下降了。
因为我只用了1个CPU,这个过程耗费了很多时间
我的问题是,在小数据和大数据之间的过渡中,新的陡峭方向是什么?我可以更多地使用谁cpu?
我搜索并找到了一些解决方案,但我需要专业意见
1 - 使用 Spark R?
2 - H20.ai 解决方案? http://h2o.ai/product/enterprise-support/
3 - 革命分析? http://www.revolutionanalytics.com/big-data
4 - 上云?像微软 azure 吗?
如果需要,我可以使用具有很多内核的虚拟机..但我需要知道进行此交易的顺利方式是什么
我的具体问题
我有这个 data.frame(但有 100 万行)
Sell<-data.frame(UserId = c(1,1,1,2,2,3,4), Code = c(111,12,333,12,111,2,3))
我做到了:
Sell[,3] <-1
test<-spread(Sell, Code, V3)
这适用于一个小数据集。但是对于 100 万行,这需要很长时间(12 小时)并且会下降,因为我的最大 ram 是 64MB。有什么建议吗?
我不确定这是一个编码问题...但是...
SQL Server 2016 的新社区预览版在服务器上内置了 R,您可以在此处下载预览版进行试用:https://www.microsoft.com/en-us/evalcenter/evaluate-sql-server-2016
这样做会将您的 R 代码带到您的数据中,并且 运行 位于 SQL 引擎之上,允许与 SQL 内置的相同类型的可扩展性。
或者您可以在 Azure 中建立虚拟机,方法是转到新门户,选择 "New" "Virtual Machine" 并搜索 "SQL"
你不会说出你想对结果做什么,但创建这样一个矩阵的最有效方法是创建一个稀疏矩阵。
这是一个类似密集矩阵的对象,为所有这些 NA
值浪费了大量 RAM。
test
# UserId 2 3 12 111 333
#1 1 NA NA 1 1 1
#2 2 NA NA 1 1 NA
#3 3 1 NA NA NA NA
#4 4 NA 1 NA NA NA
你可以使用稀疏矩阵来避免这种情况,它在内部基本上仍然是一个长格式结构,但有矩阵运算的方法。
library(Matrix)
Sell[] <- lapply(Sell, factor)
test1 <- sparseMatrix(i = as.integer(Sell$UserId),
j = as.integer(Sell$Code),
x = rep(1, nrow(Sell)),
dimnames = list(levels(Sell$UserId),
levels(Sell$Code)))
#4 x 5 sparse Matrix of class "dgCMatrix"
# 2 3 12 111 333
#1 . . 1 1 1
#2 . . 1 1 .
#3 1 . . . .
#4 . 1 . . .
使用逻辑稀疏矩阵,您将需要更少的 RAM:
test2 <- sparseMatrix(i = as.integer(Sell$UserId),
j = as.integer(Sell$Code),
x = rep(TRUE, nrow(Sell)),
dimnames = list(levels(Sell$UserId),
levels(Sell$Code)))
#4 x 5 sparse Matrix of class "lgCMatrix"
# 2 3 12 111 333
#1 . . | | |
#2 . . | | .
#3 | . . . .
#4 . | . . .
嗨, 在过去的几天里,我遇到了一个 small/big 问题。
我有一个交易数据集,有 100 万行和两列(客户 ID 和产品 ID),我想将其转换为二进制矩阵。 我使用了 reshape 和 spread 函数,但在这两种情况下我都使用了 64mb ram 并且 Rstudio/R 下降了。 因为我只用了1个CPU,这个过程耗费了很多时间 我的问题是,在小数据和大数据之间的过渡中,新的陡峭方向是什么?我可以更多地使用谁cpu?
我搜索并找到了一些解决方案,但我需要专业意见
1 - 使用 Spark R?
2 - H20.ai 解决方案? http://h2o.ai/product/enterprise-support/
3 - 革命分析? http://www.revolutionanalytics.com/big-data
4 - 上云?像微软 azure 吗?
如果需要,我可以使用具有很多内核的虚拟机..但我需要知道进行此交易的顺利方式是什么
我的具体问题
我有这个 data.frame(但有 100 万行)
Sell<-data.frame(UserId = c(1,1,1,2,2,3,4), Code = c(111,12,333,12,111,2,3))
我做到了:
Sell[,3] <-1
test<-spread(Sell, Code, V3)
这适用于一个小数据集。但是对于 100 万行,这需要很长时间(12 小时)并且会下降,因为我的最大 ram 是 64MB。有什么建议吗?
我不确定这是一个编码问题...但是...
SQL Server 2016 的新社区预览版在服务器上内置了 R,您可以在此处下载预览版进行试用:https://www.microsoft.com/en-us/evalcenter/evaluate-sql-server-2016
这样做会将您的 R 代码带到您的数据中,并且 运行 位于 SQL 引擎之上,允许与 SQL 内置的相同类型的可扩展性。
或者您可以在 Azure 中建立虚拟机,方法是转到新门户,选择 "New" "Virtual Machine" 并搜索 "SQL"
你不会说出你想对结果做什么,但创建这样一个矩阵的最有效方法是创建一个稀疏矩阵。
这是一个类似密集矩阵的对象,为所有这些 NA
值浪费了大量 RAM。
test
# UserId 2 3 12 111 333
#1 1 NA NA 1 1 1
#2 2 NA NA 1 1 NA
#3 3 1 NA NA NA NA
#4 4 NA 1 NA NA NA
你可以使用稀疏矩阵来避免这种情况,它在内部基本上仍然是一个长格式结构,但有矩阵运算的方法。
library(Matrix)
Sell[] <- lapply(Sell, factor)
test1 <- sparseMatrix(i = as.integer(Sell$UserId),
j = as.integer(Sell$Code),
x = rep(1, nrow(Sell)),
dimnames = list(levels(Sell$UserId),
levels(Sell$Code)))
#4 x 5 sparse Matrix of class "dgCMatrix"
# 2 3 12 111 333
#1 . . 1 1 1
#2 . . 1 1 .
#3 1 . . . .
#4 . 1 . . .
使用逻辑稀疏矩阵,您将需要更少的 RAM:
test2 <- sparseMatrix(i = as.integer(Sell$UserId),
j = as.integer(Sell$Code),
x = rep(TRUE, nrow(Sell)),
dimnames = list(levels(Sell$UserId),
levels(Sell$Code)))
#4 x 5 sparse Matrix of class "lgCMatrix"
# 2 3 12 111 333
#1 . . | | |
#2 . . | | .
#3 | . . . .
#4 . | . . .