2017-02-14 4 views
3

これは難しい例ですが、再現可能な例はありませんが、他の人がこれを扱っている経験があることを期待しています。saveRDSオブジェクトのサイズが膨らんでいます

私は、DBから大量のデータを取り出し、サイズを減らし、いくつかのパラメータをループして、一連の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") 

私は取得しています問題は、メモリ内でのみ10MBです「model.list」オブジェクトは、私はRDSとしてローカルに保存したときに多くのGB単位に膨らませるか、AWS S3にアップロードしようとするということです。

この関数は非常に大量のデータ(5百万行まで)を処理しますが、出力に使用されるデータは数百行以下です。

Stack Exchangeでこれについての限られた情報を読んで、主な機能(例えば、clean_dataとlm_model)の内部で外部定義された関数の一部を(パッケージの一部として)移動すると、RDSの保存サイズが小さくなります。

しかし、これには大きな欠点があります。

最初は試行錯誤であり、頻繁なクラッシュやリストオブジェクトを構築するのに数時間かかることがありますが、それは非常に長いデバッグサイクルです。

第2に、私の主な機能は、何百もの行が長くなり、将来の変更やデバッグがはるかに難しくなることを意味します。

私に質問する:

誰もこの問題が発生しましたか?

何が起こっているかに関する仮説はありますか?

論理的な試行錯誤の解決策は誰にも見つかりましたか?

ありがとうございました。

+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のモデルオブジェクトのリスト配列と地球環境に座っていたので、実際に〜100GBのデータを圧縮しようとしていたため、RDSオブジェクトが劇的に膨張しました。

これが問題の原因かどうかをテストします。次のコードを実行します。

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

これは、$ termsコンポーネントが膨らんでいるかどうかを示します。

次のコードでは、$用語コンポーネントから環境の参照を削除します:それはまた、それが参照するすべての地球環境のオブジェクトを削除しますけれども

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

は注意してください。

関連する問題