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

时间:2014-08-21 11:32:50

标签: r caching startup

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

我很欣赏我可以在交互式R会话中完成所有工作,但是在R提示符下开发多行函数会非常方便。

示例:

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

如果可能,我可以如何修改脚本,以便在后续执行时,d已经可用?是否有像cache=T降价代码块中的R语句?

4 个答案:

答案 0 :(得分:14)

排序。有几个答案:

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

  2. 同样,只需读取一次为csv,然后通过saveRDS()以紧凑的二进制形式写入,这样下次你可以readRDS()更快,因为你不必加载和解析再次提供数据。

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

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

  5. 然而,直接缓存是不可能的。

    编辑:实际上,直接缓存&#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()