防止模拟被OS杀死

时间:2012-07-09 08:58:36

标签: r simulation

这不是家庭作业,只是我的学习练习。我在R中运行了一个非常简单的模拟(或数字曲柄)。它生成两个数字(A,B)并运行1个月。

A=NULL
B=NULL
x=NULL
x <- Sys.time()
duration <-  2592000 # 30 days
while(Sys.time() <= x + duration){
A <-append(A, sample(1:5, 1000, 1/5))
B <-append(B, sample(1:5, 1000, 1/5))
save.image()
}

我认为它进展顺利,但在一周后(产生了数百万个数字),操作系统终止了这个过程。 是否有更好的方法来编写或运行模拟,以防止操作系统将其杀死?

我更愿意重写模拟而不是调整操作系统(例如添加更多交换等)。我正在低功耗设备(Raspberry Pi)上运行模拟,并且我在硬件方面的能力有限。感谢。

更新:
1)一次生成1000个样本重要。这只是我的淤泥 2) 重要的是模拟运行一段时间,即1周,1个月或1年。
3)除非不可能,否则我想要原始数据。

2 个答案:

答案 0 :(得分:1)

如果目标是创建两个大样本,请考虑以下事项:

N <- 2000000
A <- sample(1:5, N, 1/5)
B <- sample(1:5, N, 1/5)
save.image()

如果重要的是每次为A和B形成1000个样品,请考虑:

N <- 2000
n <- 1000
A.list <- vector("list", N)
B.list <- vector("list", N)
for (i in 1:N) {
   A.list[[i]] <- sample(1:5, n, 1/5) 
   B.list[[i]] <- sample(1:5, n, 1/5)
}
A <- unlist(A.list)
B <- unlist(B.list)
save.image()

这应该解决代码中的两个主要问题:

  • 每次在循环中使用append时,R必须从头开始创建并填充几个新对象。随着对象变大,循环迭代变得越来越慢;计算时间以二次方式增长我相信。你也冒着破坏你的记忆空间的风险,这很难解释,但你可以尝试研究它。通过使用列表,只需要将每次迭代的新数据存储到内存中,每个循环的计算时间保持不变。
  • 我已将save.image()移到循环之外。同样的想法,保存对象越来越大,需要越来越长的时间,即减慢迭代速度。由于您只关心最终的向量,因此只有在完成后才能保存。

您可以使用N的值来查看您的操作系统将让您走多远。优点是您无需等待一周或一个月来查明限制是什么。

答案 1 :(得分:1)

如果您考虑将结果打印在纸上作为可接受的解决方案,那么RomanLuštrik的解决方案(在您的问题的评论中)将数据附加到文本文件或数据库绝对是一个很好的解决方案。

以下是附加到文本文件的内容:

x <- Sys.time()
duration <-  2592000
while(Sys.time() <= x + duration){
    write.table(sample(1:5, 1000, 1/5),file="A.txt",append=TRUE,row.names=FALSE,col.names=FALSE,sep="\t")
    write.table(sample(1:5, 1000, 1/5),file="B.txt",append=TRUE,row.names=FALSE,col.names=FALSE,sep="\t")
}