这不是家庭作业,只是我的学习练习。我在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)除非不可能,否则我想要原始数据。
答案 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必须从头开始创建并填充几个新对象。随着对象变大,循环迭代变得越来越慢;计算时间以二次方式增长我相信。你也冒着破坏你的记忆空间的风险,这很难解释,但你可以尝试研究它。通过使用列表,只需要将每次迭代的新数据存储到内存中,每个循环的计算时间保持不变。您可以使用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")
}