gpt4 book ai didi

r - saveRDS 膨胀对象的大小

转载 作者:行者123 更新时间:2023-12-04 06:55:02 25 4
gpt4 key购买 nike

这是一个棘手的问题,因为我无法提供可重复的示例,但我希望其他人可能有处理此问题的经验。

本质上,我有一个函数可以从数据库中提取大量数据,清理并减小大小并循环遍历一些参数以生成一系列 lm 模型对象、参数值和其他引用值。这被编译成一个复杂的列表结构,总共约 10mb。

然后应该将其保存为 AWS s3 上的 RDS 文件,在生产环境中检索它以构建预测。

例如

db.connection <- db.connection.object


build_model_list <- function(db.connection) {


clean_and_build_models <- function(db.connection, other.parameters) {


get_db_data <- function(db.connection, some.parameters) {# Retrieve db data} ## Externally defined

db.data <- get_db_data()


build_models <- function(db.data, some.parameters) ## Externally defined

clean_data <- function(db.data, some.parameters) {# Cleans and filters data based on parameters} ## Externally defined


clean.data <- clean_data()


lm_model <- function(clean.data) {# Builds lm model based on clean.data} ## Externally defined

lm.model <- lm_model()


return(list(lm.model, other.parameters))} ## Externally defined


looped.model.object <- llply(some.parameters, clean_and_build_models)

return(looped.model.object)}


model.list <- build_model_list()

saveRDS(model.list, "~/a_place/model_list.RDS")

我遇到的问题是,当我在本地保存为 RDS 或尝试上传到 AWS s3 时,内存中只有 10MB 的“model.list”对象会膨胀到许多 GB。

我应该注意到,虽然该函数处理非常大量的数据(约 500 万行),但输出中使用的数据不超过几百行。

在 Stack Exchange 上阅读有关此的有限信息,我发现将一些外部定义的函数(作为包的一部分)移动到主函数(例如 clean_data 和 lm_model)中有助于减少 RDS 保存大小。

然而,这有一些很大的缺点。

首先是反复试验,没有明确的逻辑顺序,经常崩溃,构建列表对象需要几个小时,这是一个非常长的调试周期。

其次,这意味着我的主要功能将有数百行长,这将使 future 的更改和调试更加棘手。

我对你的问题是:

有没有人遇到过这个问题?

关于是什么导致它的任何假设?

有没有人找到一个合乎逻辑的非试错解决方案?

谢谢你的帮助。

最佳答案

这需要一些挖掘,但我最终确实找到了解决方案。

事实证明,罪魁祸首是 lm 模型对象。基于这篇非常有用的文章:

https://blogs.oracle.com/R/entry/is_the_size_of_your

事实证明,lm.object$terms 组件包括一个环境组件,该组件引用构建模型时存在于全局环境中的对象。在某些情况下,当您保存RDS R 时,会尝试将环境对象绘制到保存对象中。

由于我在全局环境中有大约 0.5GB 的空间和大约 200 lm 模型对象的列表数组,这导致 RDS 对象急剧膨胀,因为它实际上试图压缩大约 100GB 的数据。

测试这是否是导致问题的原因。执行以下代码:

as.matrix(lapply(lm.object, function(x) length(serialize(x,NULL)))) 

这将告诉您 $terms 组件是否膨胀。

以下代码将从 $terms 组件中删除环境引用:
rm(list=ls(envir = attr(lm.object$terms, ".Environment")), envir = attr(lm.object$terms, ".Environment")) 

尽管它也会删除它引用的所有全局环境对象,但请注意。

关于r - saveRDS 膨胀对象的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42230920/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com