我正在处理大量(例如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=""))}
}
对于我正在使用的数据集的数量和大小,这是一个非常慢的解决方案,因此我想知道是否有人能够更好地存储和加载生成的数据集。
谢谢!
答案 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列表至关重要。他们都需要放在分开的列表中吗?都一样模拟吗?等等...