【问题标题】:R - data munging and scalable code [closed]R - 数据处理和可扩展代码 [关闭]
【发布时间】:2015-11-19 10:54:12
【问题描述】:

嘿, 在过去的几天里,我遇到了一个小/大问题。

我有一个交易数据集,有 100 万行和两列(客户 ID 和产品 ID),我想将其转换为二进制矩阵。 我使用了 reshape 和 spread 功能,但在这两种情况下,我都使用了 64mb 内存并且 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 - 去云端?像微软天蓝色?

如果我需要,我可以使用具有很多内核的虚拟机.. 但我需要知道进行此交易的流畅方式是什么

我的具体问题

我有这个 data.frame(但有一百万行)

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。有什么建议吗?

【问题讨论】:

  • 你的问题太宽泛了,征求意见(两者都是题外话)。展示您的实际问题(使用可重现的示例),有人可能会提供可行的替代方案。也许你可以在没有并行化的情况下留在 vanilla R 中。
  • 你好罗兰,感谢您的评论。我刚才举个例子。问候

标签: r azure sparkr h2o data-munging


【解决方案1】:

你不知道你想对结果做什么,但创建这样一个矩阵的最有效方法是创建一个稀疏矩阵。

这是一个密集的类似矩阵的对象,它为所有这些 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 . |  .   .   .

【讨论】:

  • 我想要一个 1 和 0 的矩阵(如果客户购买产品,则为 1,如果不购买,则为 0),然后在此代码中使用此矩阵(包推荐实验室。) binary_matrix
  • @Kardu 您的问题仍然不够具体。我们仍然不知道您到底要做什么,但是您可能需要获得比仅使用该软件包更底层的东西(如果它不提供您的数据大小的设施)。如果您有许多用户和许多代码,那么密集的二进制矩阵将是巨大的。即使您可以将其装入 RAM,您也无法使用它。
  • 但是,在查看文档后,binaryRatingMatrix 似乎是一个稀疏矩阵对象。您的问题实际上似乎是如何从您的数据中创建它。
  • 我有 20 万用户和超过 10 万种产品。它是一个巨大的矩阵...这就是重点。我不知道如何解决这个问题?并行化代码?跨度>
  • 不,只是研究一下recommenderlab和arules包的文档。他们在内部使用稀疏矩阵,应该能够处理这个问题。但是,不要尝试使用 tidyr 创建密集的类似矩阵的对象,因为这对您的 RAM 来说太大了。
【解决方案2】:

我不确定这是一个编码问题...但是...

SQL Server 2016 的新社区预览版在服务器上内置了 R,您可以在此处下载预览版试用:https://www.microsoft.com/en-us/evalcenter/evaluate-sql-server-2016

这样做会将您的 R 代码带到您的数据中并在 SQL 引擎之上运行,从而实现与 SQL 内置相同的可扩展性。

或者您可以在 Azure 中建立 VM,方法是转到新门户,选择“新建”“虚拟机”并搜索“SQL”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    • 2013-04-02
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 2014-01-19
    相关资源
    最近更新 更多