2017-02-14 1 views
3

이것은 재현 가능한 예제를 제공 할 수 없기 때문에 까다로운 내용이지만 다른 사람들이이 문제를 처리해줬으면 좋겠다.saveRDS 객체의 크기를 늘림

본질적으로 DB에서 많은 양의 데이터를 가져 와서 클리닝하고 크기를 줄이고 일부 매개 변수를 반복하여 일련의 모델 개체, 매개 변수 값 및 기타 참조 값을 생성하는 기능이 있습니다. 이것은 약 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") 

내가 갖는 문제는 메모리에 10MB의입니다 'model.list'객체가 나는 RDS으로 로컬에 저장할 때 많은 GB를로 팽창 또는 AWS의 S3에 업로드 할 것입니다.

이 함수는 매우 많은 양의 데이터 (5 백만 행)를 처리하지만 출력에 사용되는 데이터는 수백 행보다 크지 않습니다.

Stack Exchange에서 제한된 정보를 읽었을 때 주 기능 (예 : clean_data 및 lm_model) 내부에서 외부에서 정의 된 일부 기능 (패키지의 일부로)을 이동하면 RDS 저장 크기가 줄어든다는 것을 알았습니다.

그러나 이것은 몇 가지 큰 단점이 있습니다.

첫째, 시행 착오이며 명확한 논리적 순서를 따르지 않으며 자주 충돌이 발생하고 목록 개체를 작성하는 데 몇 시간이 걸리며 매우 긴 디버깅주기입니다.

둘째로, 내 주요 기능이 앞으로 수천 줄의 길이가되어 향후 변경 및 디버깅이 훨씬 까다로울 수 있음을 의미합니다.

당신에게 내 질문은 :

사람이 이전에이 문제가 발생 했습니까?

무엇이 원인인지에 대한 가설은 무엇입니까?

논리적이고 시행 착오가없는 해결책을 찾은 사람이 있습니까?

도움 주셔서 감사합니다.

+0

아마도이 http://r.789695.n4.nabble.com/Model-object-when-generated-in-a-function-saves-entire-environment-when-saved-td4723192.html과 관련이 있습니다. – kennyB

답변

2

파기가 약간 걸렸지 만 실제로 결국 해결책을 찾았습니다.

유죄 당사자 인 작품이 모델 작품이었습니다. 이 매우 도움이 기사에 기반 :

그것은 lm.object $ 조항의 구성 요소가 지구 환경에 존재하는 객체에 대한 참조 모델이 구축 된 환경 구성 요소가 포함되어 있음을 밝혀

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

. 특정 상황에서, RDS를 저장하면 R은 환경 객체를 저장 객체로 가져 오려고합니다.

~ 200GB 모델 개체의 목록 배열과 지구 환경에 약 0.5GB가 있었기 때문에 실제로 ~ 100GB의 데이터를 압축하려고했기 때문에 RDS 개체가 크게 팽창했습니다.

문제의 원인인지 테스트 해보십시오. 다음 코드를 실행하십시오 :

이렇게하면 $ terms 구성 요소가 팽창하고 있는지를 알 수 있습니다.

다음 코드는 $ 약관 구성 요소에서 환경에 대한 참조를 제거합니다 : 그것은 또한 참조하는 모든 지구 환경 개체를 제거합니다하지만

rm(list=ls(envir = attr(lm.object$terms, ".Environment")), envir = attr(lm.object$terms, ".Environment")) 

가 경고합니다.

관련 문제