假设您正在处理可能无限量的数据。进一步假设您没有将此数据存储在内存中,但可以随意生成单个术语。最后,假设您想要对这些数据进行一些实验,这将涉及检查大量但未知的术语,从而需要将其中的大量术语保留在内存中。玩具问题 Recamán's sequence ,例如“找到该序列中出现的前 25 个偶数所需的最小数项”,是我想到的典型示例。
解决此类问题的明显方法是编写一些代码,例如:
list<-c(first term)
while([not found enough terms yet])
{
nextTerm<-Whatever
if(this term worked){list<-c(list,nextTerm)}
}
然而,通过一次添加一个新术语来构建这样一个大向量是你内存中最糟糕的噩梦。我经常看到建议的替代方案是通过将代码的第一行设置为类似 list<-numeric(10^6)
来在内存中预先分配一个大向量。 ,但这些解决方案假设我们对需要检查的术语有一些粗略的了解,但情况并非总是如此。那么,当我们处理不断增长的未知所需长度的列表时,我们能做什么呢?
最佳答案
这是 R 中非常流行的主题,请检查这个答案:https://stackoverflow.com/a/45195098/5442527
加起来:
不要使用 c()
进行绑定(bind),因为通过索引 [ 提供值要快得多。我知道您可以增加预分配的向量,这可能看起来令人惊讶。在 while 循环之前创建一个 iter 变量,并在 if 语句中增加索引。
通常就像在 Python 中一样,在使用追加时您不必关心它。即使从空列表开始也不是问题,因为当您传递一些周边数量的元素时,列表(保留的内存)会指数增长(x2x2x1.5x1.2...)。友情链接 Over-allocating
关于r - 对于内存来说,当需要不断地将向量增长到未知的上限时应该怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63023795/