如果R超过指定的内存限制,则跳过或退出命令

时间:2017-02-22 08:31:53

标签: r memory memory-management

如果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
}

1 个答案:

答案 0 :(得分:0)

一个想法:

如果你事先知道它的长度,你可以事先计算出矢量(矩阵)的大小。

有关

  • 整数:40 + 4 * n字节
  • 数字:40 + 8 * n字节

应该是矢量的公式。检查例如

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循环,以防使用的内存超出可用范围。