如何修改knitr缓存的存储与加载方式?相关技术疑问
knitr缓存优化相关问题解答
1. 你的判断是否正确?
完全正确。knitr 默认使用 saveRDS() 将缓存对象以R原生数据格式保存到磁盘(默认存储在文档目录下的 .cache 文件夹里),而非常驻内存。重新编织时需要从磁盘读取这些缓存文件,若对象体积较大,原生RDS格式的读写速度确实会成为瓶颈,导致重新编织提速不明显。
2. 是否有官方认可的修改方式改用qs格式?
有的,knitr 提供了缓存读写钩子(cache.save 和 cache.load)来定制缓存的存储逻辑,这是官方明确支持的扩展方式。你可以直接替换默认的读写函数为qs包的多线程版本,示例代码如下:
library(knitr) library(qs) # 设置缓存读写钩子,替换为qs的函数 opts_chunk$set( cache = TRUE, cache.save = function(object, file) qsave(object, file, nthreads = parallel::detectCores()), cache.load = function(file) qread(file, nthreads = parallel::detectCores()) )
这样后续的chunk缓存就会用qs格式存储,利用其多线程读写特性提升速度。
3. 能否将对象直接保存到不同环境并按需访问?
可以实现,有几种可行方式:
- 利用knitr自带的
cache.env参数,为特定chunk指定缓存对象存储的环境。比如:
```{r, cache=TRUE, cache.env=new.env()} # 此chunk的缓存对象会存在新建的环境中 big_data <- read.csv("large_file.csv")
后续需要访问时,可以直接从该环境中提取对象。 - 结合自定义缓存钩子,手动控制对象的存储环境。比如在`cache.save`钩子中,不仅将对象保存到磁盘,同时将其赋值到指定环境;或者在`cache.load`时,将对象加载到目标环境而非全局环境。 - 通过`cache.path`参数为不同chunk指定不同的磁盘存储路径,实现物理上的分离,按需加载对应路径下的缓存文件。 --- 内容的提问来源于stack exchange,提问作者statquant
相关产品推荐
相关产品推荐

