避免在R包drake中为目标保存缓存
我看到默认情况下,避免在R包drake中为目标保存缓存,r,drake-r-package,R,Drake R Package,我看到默认情况下,R包drake保存每个目标的所有缓存。有时,目标只是从上一个目标中选择一些列,但如果数据非常大,这意味着您将获得两个保存的目标,它们非常大。此外,如果您稍微更改一个目标,我认为drake会保存此目标的新副本,但会保留以前的副本。这意味着每次调用r\u make都会持续地保存缓存,从而积累大量内存 有没有办法选择drake保存哪些目标 有没有办法避免保留目标缓存文件的历史记录 这种累积在我的机器中占据了超过45GB的空间,这似乎太离谱了 谢谢高效的数据格式 首先,如果你的目标
R
包drake
保存每个目标的所有缓存。有时,目标只是从上一个目标中选择一些列,但如果数据非常大,这意味着您将获得两个保存的目标,它们非常大。此外,如果您稍微更改一个目标,我认为drake
会保存此目标的新副本,但会保留以前的副本。这意味着每次调用r\u make
都会持续地保存缓存,从而积累大量内存
- 有没有办法选择drake保存哪些目标
- 有没有办法避免保留目标缓存文件的历史记录
首先,如果你的目标是数据帧(或者<代码>数据>表>代码> s,考虑使用自定义的“FST”(或“FSTYDT”)格式保存这些目标:目标将占用更少的空间并节省更多的时间。很快就赢了
目标应该是什么? 其次,让我们谈谈您提出的两个目标没有那么大区别的场景库(德雷克)
图书馆(dplyr)
德雷克图(
raw=获取原始数据(),
数据=选择(-funds)%>%
过滤器(消耗<900),
分析=分析(数据)
)
#>#tibble:3 x 2
#>目标命令
#>
#>1原始获取原始数据()
#>2数据选择(-funds)%%>%过滤器(支出<900)
#>3分析(数据)
由(v0.3.0)于2019年10月22日创建
raw
和data
基本上是彼此的副本,而且它们很大。如果您只使用raw
计算数据
,我们可以跳过raw
,定义自己的函数直接转到数据
。以下计划将使用更少的存储空间
库(德雷克)
图书馆(dplyr)
获取数据%
选择(-funds)%>%
过滤器(小于900)
}
德雷克图(
数据=获取数据(),
分析=分析(数据)
)
#>#tibble:2x2
#>目标命令
#>
#>1数据获取_数据()
#>2分析(数据)
由(v0.3.0)于2019年10月22日创建
以这种方式定义和使用函数是一种很好的做法。这不仅有助于你对选择的目标更具战略性,还使你的计划更容易阅读
要想弄清楚什么是目标,什么是进入目标内部的步骤,需要仔细考虑。理想的目标是
make()
倾向于跳过它,并且drake的缓存在后端使用,后端不存储重复的对象。但是,它确实会存储旧目标,您很可能会尝试使用make(recover=TRUE)
来恢复它们。但是如果您的缓存变得太大,您可以通过垃圾收集删除这些历史目标,可以使用drake\u gc()
或drake\u cache()$gc()
减轻存储负担的其他技巧包括make()
中的history=FALSE
,log\u progress=FALSE
,以及recoverable=FALSE
。最后这些并不会使总体存储大小减少很多,但会减少缓存中的小文件数量
关于内存,手册中有一章:。为了减少会话内存消耗,您可以选择自定义内存策略,并在make()
高效数据格式中选择garbage\u collection=TRUE
首先,如果你的目标是数据帧(或者<代码>数据>表>代码> s,考虑使用自定义的“FST”(或“FSTYDT”)格式保存这些目标:目标将占用更少的空间并节省更多的时间。很快就赢了
目标应该是什么?
其次,让我们谈谈您提出的两个目标没有那么大区别的场景
库(德雷克)
图书馆(dplyr)
德雷克图(
raw=获取原始数据(),
数据=选择(-funds)%>%
过滤器(消耗<900),
分析=分析(数据)
)
#>#tibble:3 x 2
#>目标命令
#>
#>1原始获取原始数据()
#>2数据选择(-funds)%%>%过滤器(支出<900)
#>3分析(数据)
由(v0.3.0)于2019年10月22日创建
raw
和data
基本上是彼此的副本,而且它们很大。如果您只使用raw
计算数据
,我们可以跳过raw
,定义自己的函数直接转到数据
。以下计划将使用更少的存储空间
库(德雷克)
图书馆(dplyr)
获取数据%
选择(-funds)%>%
过滤器(小于900)
}
德雷克图(
数据=获取数据(),
分析=分析(数据)
)
#>#tibble:2x2
#>目标命令
#>
#>1数据获取_数据()
#>2分析(数据)
由(v0.3.0)于2019年10月22日创建
以这种方式定义和使用函数是一种很好的做法。这不仅有助于你对选择的目标更具战略性,还使你的计划更容易阅读
要想弄清楚什么是目标,什么是进入目标内部的步骤,需要仔细考虑。理想的目标是
大到足以消耗大量的运行时间
足够小以至于make()
倾向于跳过它,并且
对你的项目有意义
列选择通常太快,无法证明创建一个全新的目标是正确的
管理缓存
drake的缓存在后端使用,后端不存储重复的对象。但是,它确实将旧目标存储在off c上