r - lm的内存问题

标签 r memory lm

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

以下代码段是我的函数由于数据量大而失败的地方。我尝试了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。任何有关如何优化这一点的技巧都将不胜感激。

最佳答案

内存使用率上升是因为每次对biglm()的调用都会在内存中复制数据。由于sapply()本质上是一个for循环,因此使用doMC(或doParallel)允许使用内存中数据的单个副本进行循环。这是一种可能性:

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

library(tidyverse)
library(pryr)

# toy data
df <- sample_n(mtcars, size = 1e7, replace = T)   
df$A <- as.factor(letters[1:5]) 

# get objects / save on disk
all_vars <- names(df) 
y <- "mpg"  
vars.model <- "cyl"
vars.remaining <- all_vars[-c(1:2)]
save(y, vars.model, vars.remaining, file = "all_vars.RData") 
readr::write_delim(df, path = "df.csv", delim = ";")

# close R session and start fresh

library(ff)
library(biglm)
library(doMC)
library(tidyverse)

# read flat file as "ff" ; also read variables
ff_df <- read.table.ffdf(file = "df.csv", sep = ";", header = TRUE)
load("all_vars.RData") 

# prepare the "cluster"
nc <- 2 # number of cores to use
registerDoMC(cores = nc)

# make all formula
fo <- paste0(y, "~", vars.model, "+", vars.remaining)
fo <- modify(fo, as.formula) %>%
  set_names(vars.remaining)

# fit models in parallel
all_rsq <- foreach(fo = fo) %dopar% {
  fit <- biglm(formula = fo, data = ff_df)
  new.rsq <- summary(fit)$rsq
}

关于r - lm的内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49984743/

相关文章:

使用 dplyr 替换来自不同数据帧的多列

string - R字符串分割函数(strsplit)中的非字符参数

r - plotly plotly 没有出现

r - "Download"按钮打开一个新的应用程序窗口而不下载 - Shiny

android - 为什么 Android 4.0/4.0.3 中运行时被阻止?

c# - 我怎样才能在 C# stream.Read 到非托管内存流?

r - 使用 `D` 获取回归多项式的导数时出错

java - Google App 引擎 - 了解实例如何启动以及需要什么内存 (Java)

r - LM 和 LME 结果的标准误

r - 在 R 中使用 lm 时,可变长度不同错误