如果R在任何时间超过指定的内存限制,我想运行一个跳过或退出命令的代码块。为了说明相关示例,如果代码块超过指定的时间限制,则以下代码将跳到for循环的下一次迭代。它将打印:' 1','跳过',' 2'
params = c(1,4,2)
for(i in params) {
tryCatch(
expr = {
evalWithTimeout({
Sys.sleep(i)
print(i)
},
timeout = 3) #go to next iteration if block takes more than 3 seconds
},
TimeoutException = function(x) cat("skip")
)
}
我想做类似的事情,但如果R超过内存限制,则跳过或退出命令。例如,如何打印以下代码:' 1',NOTHING,' 2'。请注意,在完全构建之前,应跳过具有1000行的第二个矩阵。另外,我不知道需要事先跳过的矩阵/对象的大小,我只会知道memory_limit
unknown = matrix(rnorm(1000*1000), ncol = 1000, nrow = 1000) #unknown object
memory_limit = object.size(unknown)-100000 #known memory limit that happens to be just under the object
##Evaluate_in_memory_limit##{
print(nrow(matrix(rnorm(1*1), ncol = 1, nrow = 1)))
print(nrow(unknown)) #this should be skipped
print(nrow(matrix(rnorm(2*2), ncol = 2, nrow = 2))),
limit = memory_limit
}
答案 0 :(得分:0)
一个想法:
如果你事先知道它的长度,你可以事先计算出矢量(矩阵)的大小。
有关
应该是矢量的公式。检查例如
sapply((1:3)^10, function(n) object.size(numeric(n)))
# or for matrix
sapply((1:3)^10, function(n) object.size(matrix(numeric(n))))
然后在unix上使用system('free')
来确定可用内存。
在for
循环中创建元素,并使用if
条件检查next
循环,以防使用的内存超出可用范围。