saveRDS inflando o tamanho do objeto

Este é um caso complicado, pois não posso fornecer um exemplo reproduzível, mas espero que outros possam ter tido experiência em lidar com isso.

Essencialmente, tenho uma função que extrai uma grande quantidade de dados de um banco de dados, limpa e reduz o tamanho e faz loops através de alguns parâmetros para produzir uma série de objetos de modelo lm, valores de parâmetros e outros valores de referência. Isso é compilado em uma estrutura de lista complexa que totaliza cerca de 10 MB.

Em seguida, ele deve ser salvo como um arquivo RDS no AWS s3, onde é recuperado em um ambiente de produção para criar previsões.

por exemplo.

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")

O problema que estou recebendo é que o objeto 'model.list', com apenas 10 MB de memória, será inflado para muitos GBs quando eu salvar localmente como RDS ou tentar fazer o upload para o AWS s3.

Devo observar que, embora a função processe quantidades muito grandes de dados (~ 5 milhões de linhas), os dados usados nas saídas não são maiores que algumas centenas de linhas.

Ao ler as informações limitadas sobre isso no Stack Exchange, descobri que mover algumas das funções definidas externamente (como parte de um pacote) dentro da função principal (por exemplo, clean_data e lm_model) ajuda a reduzir o tamanho de gravação do RDS.

No entanto, isso tem algumas grandes desvantagens.

Em primeiro lugar, é tentativa e erro e não segue uma ordem lógica clara, com falhas freqüentes e algumas horas necessárias para criar o objeto de lista, é um ciclo de depuração muito longo.

Em segundo lugar, isso significa que minha função principal terá muitas centenas de linhas, o que tornará futuras alterações e depurações muito mais complicadas.

Minha pergunta para você é:

Alguém já encontrou esse problema antes?

Alguma hipótese sobre o que está causando isso?

Alguém encontrou uma solução lógica de não tentativa e erro para isso?

Obrigado pela ajuda.

questionAnswers(2)

yourAnswerToTheQuestion