分别保存模拟数据集(速度+内存限制)

时间:2018-07-17 08:19:11

标签: r performance memory storage simulation

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

# 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=""))}
}

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

谢谢!

1 个答案:

答案 0 :(得分:0)

如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列表至关重要。他们都需要放在分开的列表中吗?都一样模拟吗?等等...