lm的内存问题

时间:2018-04-23 15:29:18

标签: r memory lm

我有一个包含大约400万行和15个变量的大型数据框。我试图实现一个模型选择算法,该算法会添加一个变量,导致r平方到lm模型的增幅最大。

以下代码段是由于数据量较大而使我的函数失败的地方。我试过biglm但仍然没有运气。我在这里使用mtcars作为示例来说明。

library(biglm)
library(dplyr)
data <- mtcars
y <- "mpg"
vars.model <- "cyl"
vars.remaining <- setdiff(names(data), c("mpg", "cyl"))

new.rsq <- sapply(vars.remaining, 
                  function (x) {
                      vars.test <- paste(vars.model, x, sep="+")
                      fit.sum <- biglm(as.formula(paste(y, vars.test, sep="~")), 
                                       data) %>% summary()
                      new.rsq <- fit.sum$rsq 
                  })
new.rsq

我不确定R在这里处理内存的确切程度,但我的400万行数据的biglm输出非常小(6.6 KB)。当我将其包装到sapply时,我不知道它累积到几GB。任何有关如何优化这一点的提示都非常感谢。

2 个答案:

答案 0 :(得分:0)

内存使用率上升,因为每次调用<script type="text/javascript"> window.onerror = function(errorMsg, url, lineNumber) { alert(errorMsg + lineNumber); // alert("This is a stack trace! Wow! --> %s", error.stack); }; </script> <script type="text/javascript"> //var x=document.getElementById("demo").value; //uncomment and run to see document.write('careless to close the parentheses?'; // ')' is not given </script>都会在内存中复制数据。由于biglm()基本上是for循环,因此使用sapply()(或doMC)允许使用内存中单个数据副本完成循环。这是一种可能性:

编辑:正如@moho吴指出的那样,平行拟合有帮助,但还不够。因素比普通字符更有效,所以这也有帮助。然后doParallel可以帮助更多,因为它在磁盘上而不是在内存中保存更大的数据集。我使用ffff更新了以下代码,使其成为一个完整的玩具示例。

doMC

答案 1 :(得分:0)

我的问题的罪魁祸首是我有很多字符列。我使用原始脚本将它们全部更改为因素后,它工作正常。

data %>%
  mutate_if(is.character, as.factor)

@ meriops&#39;答案也是合理的。如果对数据帧进行分解并不能解决问题,则可能需要考虑并行处理