我正在处理一个必须加载数据的R
脚本(显然)。数据加载需要花费很多精力(500MB),我想知道每次重新运行脚本时是否可以避免必须完成加载步骤,我在开发过程中会做很多事情。
我很欣赏我可以在交互式R
会话中完成所有工作,但是在R
提示符下开发多行函数会非常方便。
示例:
#!/usr/bin/Rscript
d <- read.csv("large.csv", header=T) # 500 MB ~ 15 seconds
head(d)
如果可能,我可以如何修改脚本,以便在后续执行时,d
已经可用?是否有像cache=T
降价代码块中的R
语句?
答案 0 :(得分:14)
排序。有几个答案:
使用更快的csv读取:fread()
包中的data.table()
被许多人所喜爱。你的时间可能会缩短到一两秒。
同样,只需读取一次为csv,然后通过saveRDS()
以紧凑的二进制形式写入,这样下次你可以readRDS()
更快,因为你不必加载和解析再次提供数据。
不要读取数据,而是通过包mmap
进行内存映射。这涉及更多,但可能非常快。数据库在内部使用这种技术。
按需加载,例如包SOAR
包在这里很有用。
然而,直接缓存是不可能的。
编辑:实际上,直接缓存&#34;排序&#34;如果您在最后使用R会话保存数据集,则可以正常工作。我们中的许多人建议不要这样做,因为明确可重复的脚本使得加载显式优先在我们的视图中 - 但R可以通过load()
/ save()
机制帮助(它同时批量处理几个对象{{ 1}} / saveRSS()
处理单个对象。
答案 1 :(得分:3)
包'R.cache'R.cache
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")
}
答案 2 :(得分:2)
我使用exists
检查对象是否存在并有条件地加载,即:
if (!exists(d))
{
d <- read.csv("large.csv", header=T)
# Any further processing on loading
}
# The rest of the script
如果您想再次加载/处理文件,请在采购前使用rm(d)
。请注意不要使用已经在别处使用的对象名称,否则它会选择它并且不加载。
答案 3 :(得分:0)
我在"Caching in R"中编写了一些R中缓存的常用方法,并将其发布给R-Blogger。为了您的目的,我建议仅使用'qs'(快速序列化)包中的saveRDS()
或qs()
。我的软件包'mustashe'使用qs()
读写文件,因此您也可以使用mustashe::stash()
。