我有一个包含大约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。任何有关如何优化这一点的提示都非常感谢。
答案 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
可以帮助更多,因为它在磁盘上而不是在内存中保存更大的数据集。我使用ff
和ff
更新了以下代码,使其成为一个完整的玩具示例。
doMC
答案 1 :(得分:0)
我的问题的罪魁祸首是我有很多字符列。我使用原始脚本将它们全部更改为因素后,它工作正常。
data %>%
mutate_if(is.character, as.factor)
@ meriops&#39;答案也是合理的。如果对数据帧进行分解并不能解决问题,则可能需要考虑并行处理