避免在R包Drake中为目标保存缓存

时间:2019-10-22 11:40:09

标签: r drake-r-package

我看到默认情况下,R软件包drake为每个目标保存所有缓存。有时,一个目标只是从前一个目标中选择一些列,但是如果数据确实很大,则意味着您将获得两个保存的目标,它们确实很大。另外,如果您稍微更改目标,我认为drake将保存该目标的新副本,但保留先前的副本。这意味着每次对r_make的调用都会持续节省您的缓存,从而节省大量内存。

  • 是否可以选择drake保存哪些目标?
  • 是否可以避免保留目标缓存文件的历史记录?

此堆积在我的计算机上占据了超过45GB的空间,

谢谢

1 个答案:

答案 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创建

rawdata基本上是彼此的副本,并且很大。如果仅使用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创建

以这种方式定义和使用函数是极好的实践。这不仅有助于您对选择的目标更具策略性,而且使计划更易于阅读。

需要认真思考才能确定目标是什么,以及在目标内部 采取的步骤。理想的目标是

  1. 足够大以消耗大量的运行时间,并且
  2. 足够小,以致make()倾向于跳过它,并且
  3. 对您的项目有意义。

列选择通常太快,以至于无法证明创建一个新的目标。

管理缓存

drake的缓存在后端使用storr,该后端不存储重复的对象。但是,它确实会存储 old 个目标,以免您尝试用make(recover = TRUE)恢复它们。但是,如果您的缓存太大,则可以使用drake_gc()drake_cache()$gc()通过垃圾回收删除这些历史目标。

其他减轻存储空间的技巧是history = FALSE中的log_progress = FALSErecoverable = FALSEmake()。这些最后的文件并没有减少太多的整体存储大小,但是确实减少了缓存中小文件的数量。

关于内存,手册中有一章:https://ropenscilabs.github.io/drake-manual/memory.html。为了减少会话中的内存消耗,可以选择一种自定义内存策略,然后在garbage_collection = TRUE中选择make()