请考虑以下选项:
预先分配任何所需的对象,而不是迭代地使用值扩展它,这需要机器使用内存重新分配空间,您可以为现有元素赋值:
models_glm <- vector(mode = "list", length = 45)
实际上,甚至考虑事先命名元素:
pnames <- sapply(1:nrow(combinations)-1, function(i){ paste0(predictor_names[combinations[i,1]], "_*_", predictor_names[combinations[i,2]]) }) models_glm <- setNames(vector(mode="list", length=45), pnames)
使用 data.table::rbindlist() 在一次调用中将数据表列绑定到一个大型数据帧,而不是在循环内逐行扩展数据帧。以下用途 lapply 返回一个等于输入长度的对象。另外,请注意要避免的空数据表 NULL 回来,离开了 rbindlist :
data.table::rbindlist()
lapply
NULL
rbindlist
dTList <- lapply(seq(nrow(combinations)-1), function(i) { #... same as above # use <<- operator to update environment object outside function models_glm[[paste0(m_name, "_*_", k_name)]] <<- model #... Coefficients_df <- setNames(as.data.frame(summary(model)$coefficients), c("Estimate", "SE", "Z", "p.value")) if(dim(Coefficients_df)[1] == 4){ data.table( Predictor_1 = m_name , Predictor_2 = k_name, dev_ratio = dev.ratio, Estimate = Coefficients_df$Estimate[4], p.value = Coefficients_df$p.value[4] ) } else { # RETURN EMPTY DT data.table( Predictor_1 = character(), Predictor_2 = character(), dev_ratio = numeric(), Estimate = numeric(), p.value = numeric() ) } }) coefficients <- data.table::rbindlist(dTlist) rm(dTlist) gc()
最后,对于不需要设计/编程工作的大型操作,请考虑使用RStudio或Rgui上的自动Rscript.exe,因为这些后续程序需要额外的资源。下面是一个命令行,可以从PowerShell,CMD提示符或批处理(.bat)文件运行,假设Rscript是环境PATH变量:
Rscript "C:\Path\To\ModelCoefficientDataBuild.R"
具体来说,Windows上的RStudio的rsession.exe在会话结束之前一旦获得它就不会将内存释放回操作系统。看到 关于主题的RStudio论坛帖子 。当然,请务必将您需要的对象保存到磁盘以供以后使用:
saveRDS(coefficients, "coefficients_datatable.rds")