我不想为我的一些计算保存巨大的中间结果,因此想要运行一些测试而不保存这些内存昂贵的向量。
说,在计算过程中,我有一个任意长度为l的向量。
但我不知道我是什么,我无法将矢量保存在记忆中。
有没有办法可以引用矢量的长度,比如
vec[100:END] or vec[100:-1] or vec[100:last]
请注意vec
这里不是变量,它只是指一个输出向量的中间表达式。
我知道长度,头部和尾部的功能,而vec [ - (1:99)]是一个等价的表达式。
但是,我实际上想知道是否有一些引用将从指定的数字运行迭代到'结束'矢量。
谢谢!
答案 0 :(得分:2)
我可能不理解你的问题。如果这不是有用的,请告诉我,我将删除它。
我想收集你想要从任意长度的向量中提取元素,从元素N到结尾,而不显式存储向量(如果你想使用它是必需的,例如length(vec)
)。这有两种方式:
N <- 5 # grab element 5 to the end.
set.seed(12)
(1:sample(N:100,1))[-(1:(N-1))]
# [1] 5 6 7 8 9 10 11
set.seed(12)
tail(1:sample(N:100,1),-(N-1))
# [1] 5 6 7 8 9 10 11
这两个都创建(暂时)随机长度(&gt; = 5)的整数序列,并将元素从5提取到结尾而不进行自引用。
答案 1 :(得分:0)
你曾经多次提到记忆。如果您关注内存并分配大型对象,则应该查看Memory-limits
文档和相关链接。首先,有一些方法可以对R中的语言进行操作。这里我只分配一个对象,函数f
,并在不进行任何其他任务的情况下使用它。
> f <- function(x, y) x:y ## actually, g <- ":" is only 96 bytes
> object.size(f)
# 1560 bytes
> f(5, 20)[3:7]
# [1] 7 8 9 10 11
> object.size(f)
# 1560 bytes
> f(5, 20)[3:length(f(5, 20))]
# [1] 7 8 9 10 11 12 13 14 15 16 17 18 19 20
> object.size(f)
# 1560 bytes
您还可以使用expression
来保留未评估的函数调用。
> e <- expression(f(5, 20)) ## but again, g <- ":" is better
> eval(e)
# [1] 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
> eval(e)[6:9]
# [1] 10 11 12 13
> eval(e)[6:length(eval(e))]
# [1] 10 11 12 13 14 15 16 17 18 19 20
> rev(eval(e))
# [1] 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5
根据您正在使用的数据类型,有多种方法可以使用 避免在会话期间使用大量内存。这里有一些相关的 你的问题。
memory.profile()
gc()
# used (Mb) gc trigger (Mb) max used (Mb)
# Ncells 274711 14.7 531268 28.4 531268 28.4
# Vcells 502886 3.9 1031040 7.9 881084 6.8
?gc()是很好的知识,我无法解释它。最好阅读
关于它。另外,我刚学习了memCompress()和memDecompress()
内存压缩/存储。这看一下另外,如果您正在与之合作
整数值,通知R有关它可以帮助节省内存
这是L
电话结束时rep.int()
的用途。
x <- rep.int(5L, 1e4L)
y <- as.raw(x)
z1 <- memCompress(y)
z2 <- memCompress(y, "b")
z3 <- memCompress(y, "x")
mapply(function(a) object.size(get(a)), c('x','y','z1','z2','z3'))
# x y z1 z2 z3
# 40040 10040 88 88 168
还有
delayedAssign("p", rep.int(5L, 1e5L))
是一个promise object
,它占用0个字节的内存,直到它被首次评估。