首页 > 解决方案 > 单独保存模拟数据集(速度+内存限制)

问题描述

我正在处理大量(比如 200 万)模拟数据集,这些数据集在 for 循环中创建并以 2000 个为一组列出。我想将 2000 个数据集的所有 1000 个列表保存在某处,以便我可以执行任何分析无需再次生成数据。将所有 200 万个数据集保存在嵌套列表中会超出内存,因此这不是一种选择。因此,我尝试将它们保存在工作区中的每个子列表中:

# Generate data
data_list <- vector("list", 2000)

for(i in 1:1000){
    for(j in 1:2000){
        dataA <- cbind(rnorm(j),rnorm(j),rnorm(j),rnorm(j),rnorm(j),rnorm(j),rnorm(j),rnorm(j))
        dataB <- cbind(rnorm(j),rnorm(j),rnorm(j),rnorm(j),rnorm(j),rnorm(j),rnorm(j),rnorm(j))
        data_list[[j]] <- dataA-dataB
    }

# Write to workspace
assign(paste("Data",i,sep=""), data_list)

# Add to existing workspace and remove object (to save memory).
if(file.exists("Workspaces.RData")){  
    old.objects <- load("Workspaces.RData")
    save(list=c(old.objects, paste("Data",i,sep="")),file="Workspaces.RData") 
    rm(list=c(old.objects,paste("Data",i,sep="")))

# Or create new workspace if it does not exist
}else{
    save(list=paste("Data",i,sep=""), file="Workspaces.RData")
    rm(list=paste("Data",i,sep=""))}
}

对于我正在使用的数据集的数量和大小,这是一个非常缓慢的解决方案,所以我想知道是否有人有更好的解决方案来存储和加载生成的数据集。

提前致谢!

标签: rperformancememorystoragesimulation

解决方案


正如 F.Privé 所说,如果您需要保存这些文件,最好使用 saveRDS。在这种情况下,您不会进行多余的保存和加载。

jj <- 1:2000
for(i in 1:10){
  for(j in jj){
    dataA <- cbind(rnorm(j),rnorm(j),rnorm(j),rnorm(j),rnorm(j),rnorm(j),rnorm(j),rnorm(j))
    dataB <- cbind(rnorm(j),rnorm(j),rnorm(j),rnorm(j),rnorm(j),rnorm(j),rnorm(j),rnorm(j))
    data_list[[j]] <- dataA-dataB
  }
  saveRDS(data_list, paste0("Data", i, '.rds'))
}

在这个特定的数据模拟中,我会尽量避免循环。一次(或至少部分)生成所有数据,然后使用索引列存储到 data.frame。就像是:

dataA <- replicate(8, rnorm(sum(jj)))
dataB <- replicate(8, rnorm(sum(jj)))
data_list <- dataA - dataB
data <- as.data.frame(data_list)
data[, "ind"] <- rep(jj, times = jj)

但由于我认为这不是您的真实数据模拟,因此了解您为什么要模拟 2k 数据集的 1k 列表至关重要?他们都需要在单独的列表中吗?都是一样的模拟吗?等等...


推荐阅读