我可以在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")
        }