我看到默认情况下,R
软件包drake
为每个目标保存所有缓存。有时,一个目标只是从前一个目标中选择一些列,但是如果数据确实很大,则意味着您将获得两个保存的目标,它们确实很大。另外,如果您稍微更改目标,我认为drake
将保存该目标的新副本,但保留先前的副本。这意味着每次对r_make
的调用都会持续节省您的缓存,从而节省大量内存。
drake
保存哪些目标?此堆积在我的计算机上占据了超过45GB的空间,
谢谢
答案 0 :(得分:0)
首先,如果您的目标是数据帧(或data.table
),请考虑使用自定义的“ fst”(或“ fst_dt”)格式保存这些目标:https://github.com/ropensci/drake/pull/977。目标将占用更少的空间并节省更多时间。那是一个快速的胜利。
第二,我们来谈谈您提出的两个目标并没有那么不同的情况。
library(drake)
library(dplyr)
drake_plan(
raw = get_raw_data(),
data = select(-funds) %>%
filter(spending < 900),
analysis = analyze(data)
)
#> # A tibble: 3 x 2
#> target command
#> <chr> <expr>
#> 1 raw get_raw_data()
#> 2 data select(-funds) %>% filter(spending < 900)
#> 3 analysis analyze(data)
由reprex package(v0.3.0)于2019-10-22创建
raw
和data
基本上是彼此的副本,并且很大。如果仅使用raw
来计算data
,则可以跳过raw
并定义我们自己的函数以直接转到data
。以下计划将使用更少的存储空间。
library(drake)
library(dplyr)
get_data <- function() {
get_raw_data() %>%
select(-funds) %>%
filter(spending < 900)
}
drake_plan(
data = get_data(),
analysis = analyze(data)
)
#> # A tibble: 2 x 2
#> target command
#> <chr> <expr>
#> 1 data get_data()
#> 2 analysis analyze(data)
由reprex package(v0.3.0)于2019-10-22创建
以这种方式定义和使用函数是极好的实践。这不仅有助于您对选择的目标更具策略性,而且使计划更易于阅读。
需要认真思考才能确定目标是什么,以及在目标内部 采取的步骤。理想的目标是
make()
倾向于跳过它,并且列选择通常太快,以至于无法证明创建一个新的目标。
drake
的缓存在后端使用storr
,该后端不存储重复的对象。但是,它确实会存储 old 个目标,以免您尝试用make(recover = TRUE)
恢复它们。但是,如果您的缓存太大,则可以使用drake_gc()
或drake_cache()$gc()
通过垃圾回收删除这些历史目标。
其他减轻存储空间的技巧是history = FALSE
中的log_progress = FALSE
,recoverable = FALSE
和make()
。这些最后的文件并没有减少太多的整体存储大小,但是确实减少了缓存中小文件的数量。
关于内存,手册中有一章:https://ropenscilabs.github.io/drake-manual/memory.html。为了减少会话中的内存消耗,可以选择一种自定义内存策略,然后在garbage_collection = TRUE
中选择make()
。