我可以在R中缓存数据加载吗?
我正在编写一个我可以在R中缓存数据加载吗?,r,caching,startup,R,Caching,Startup,我正在编写一个R脚本,它必须加载数据(显然)。数据加载需要花费大量的精力(500MB),我想知道是否可以避免每次重新运行脚本时都要经历加载步骤,我在开发过程中经常这样做 我很感激我可以在交互式R会话中完成全部工作,但是在R提示符下开发多行函数就不那么方便了 例如: #!/usr/bin/Rscript d <- read.csv("large.csv", header=T) # 500 MB ~ 15 seconds head(d) #/usr/bin/Rscript d有点。有几个答案
R
脚本,它必须加载数据(显然)。数据加载需要花费大量的精力(500MB),我想知道是否可以避免每次重新运行脚本时都要经历加载步骤,我在开发过程中经常这样做
我很感激我可以在交互式R
会话中完成全部工作,但是在R
提示符下开发多行函数就不那么方便了
例如:
#!/usr/bin/Rscript
d <- read.csv("large.csv", header=T) # 500 MB ~ 15 seconds
head(d)
#/usr/bin/Rscript
d有点。有几个答案:
使用更快的csv读取:data.table()
包中的fread()
,很多人都喜欢它。你的时间可能会缩短到一两秒钟
类似地,以csv格式读取一次,然后通过saveRDS()
以压缩二进制格式写入,这样下次您就可以执行readRDS()
操作,因为您无需再次加载和解析数据,因此速度会更快
不要读取数据,而是通过软件包mmap
对其进行内存映射。这涉及更多,但可能很快。数据库在内部使用这种技术
按需加载,例如包SOAR
包在这里很有用
但是,直接缓存是不可能的
编辑:实际上,如果您在R会话结束时保存数据集,那么直接缓存“排序”是有效的。我们中的许多人建议不要这样做,因为在我们看来,使加载显式化的清晰可复制脚本是最好的——但是R可以通过load()
/save()
机制(在saveRSS()
/readRDS()的位置同时对多个对象进行批处理)提供帮助
处理单个对象。我使用exists
检查对象是否存在并有条件加载,即:
if (!exists(d))
{
d <- read.csv("large.csv", header=T)
# Any further processing on loading
}
# The rest of the script
如果(!存在(d))
{
dR.cache包
start\u year我在年编写了一些在R中缓存的常用方法,并将其发布给R-Bloggers。出于您的目的,我建议只使用(快速序列化)包中的saveRDS()
或qs()
。我的包使用qs()
用于读取和写入文件,因此您可以使用mustashe::stash()
。效率仍然需要很长时间,但解决方案是准备中间数据集,保留分析所需的表的这些部分,然后只保存/加载这些部分。上面的Nr 2将是最合理的解决方案,并使用调用exists
将其与之配对,前提是您希望以迭代方式将脚本电子化到全局工作区中。例如,if(!exists(“d”){if(files.exsits(rds){#load rds}else{#load csv,save as rds}
cache=T
pragma将是一个很好的增强建议,类似于Python对decorator所做的操作(但仅限于使用不可变参数的fn调用)。您可能需要将d
包装在''
内。谢谢您的回答,但最好不要将答案主要与将来可能中断的链接联系起来。
start_year <- 2000
end_year <- 2013
brics_countries <- c("BR","RU", "IN", "CN", "ZA")
indics <- c("NY.GDP.PCAP.CD", "TX.VAL.TECH.CD", "SP.POP.TOTL", "IP.JRN.ARTC.SC",
"GB.XPD.RSDV.GD.ZS", "BX.GSR.CCIS.ZS", "BX.GSR.ROYL.CD", "BM.GSR.ROYL.CD")
key <- list(brics_countries, indics, start_year, end_year)
brics_data <- loadCache(key)
if (is.null(brics_data)) {
brics_data <- WDI(country=brics_countries, indicator=indics,
start=start_year, end=end_year, extra=FALSE, cache=NULL)
saveCache(brics_data, key=key, comment="brics_data")
}