我可以在R中缓存数据加载吗?

TMO*_*TTM 12 caching r startup

我正在编写一个R必须加载数据的脚本(显然).数据加载需要花费很多精力(500MB),我想知道每次重新运行脚本时是否可以避免必须完成加载步骤,我在开发过程中做了很多工作.

我很欣赏我可以在交互式R会话中完成所有工作,但是在R提示符上开发多行函数就不那么方便了.

例:

#!/usr/bin/Rscript
d <- read.csv("large.csv", header=T) # 500 MB ~ 15 seconds
head(d)
Run Code Online (Sandbox Code Playgroud)

如果可能的话,我如何修改脚本,以便在后续执行时d已经可用?是否有类似于降价代码块的cache=T声明R

Dir*_*tel 14

有点.有几个答案:

  1. 使用更快的csv读取: fread()data.table()包中受到许多人的喜爱.你的时间可能会缩短到一两秒.

  2. 类似地,读取一次为csv然后以紧凑的二进制形式写入,saveRDS()这样下次你可以做的readRDS()更快,因为你不必再次加载和解析数据.

  3. 不要读取数据,而是通过包进行内存映射mmap.这涉及更多,但可能非常快.数据库在内部使用这种技术.

  4. 按需加载,例如包裹SOAR包在这里很有用.

但是,直接缓存是不可能的.

编辑:实际上,如果您在最后使用R会话保存数据集,则直接缓存"有点".我们中的许多人建议不要这样做,因为明确可重复的脚本使得加载显式最好在我们看来 - 但是R可以通过load()/ save()机制帮助(在saveRSS()readRDS()`处理单个对象时,它会同时批量生成多个对象.