单独保存模拟数据集(速度+内存限制)
Save simulated datasets individually (speed + memory limit)
我正在处理大量(比如两百万)模拟数据集,这些数据集是在 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=""))}
}
对于我正在使用的数据集的数量和大小来说,这是一个非常慢的解决方案,所以我想知道是否有人有更好的解决方案来存储和加载生成的数据集。
提前致谢!
如 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 列表是至关重要的?他们都需要在单独的列表中吗?都是一样模拟的吗?等等...
我正在处理大量(比如两百万)模拟数据集,这些数据集是在 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=""))}
}
对于我正在使用的数据集的数量和大小来说,这是一个非常慢的解决方案,所以我想知道是否有人有更好的解决方案来存储和加载生成的数据集。
提前致谢!
如 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 列表是至关重要的?他们都需要在单独的列表中吗?都是一样模拟的吗?等等...