在Ruby中使用WeakRef的成本是多少?

在Ruby中使用WeakRef的成本是多少?,ruby,data-structures,memory-management,weak-references,Ruby,Data Structures,Memory Management,Weak References,我想知道使用处理大型数据集的开销是多少 我想执行的任务如下: huge = get_array_of_weak_refs # 100000000 entries or more :) result = huge.length * huge.inject(0) { |accum, it| accum += it.total } # much more complicated, just a sample 假设get\u array\u of_weak\u refs并不耗时,并且具有O(1)复杂性

我想知道使用处理大型数据集的开销是多少

我想执行的任务如下:

huge = get_array_of_weak_refs # 100000000 entries or more :)
result = huge.length * huge.inject(0) { |accum, it| accum += it.total } # much more complicated, just a sample
假设
get\u array\u of_weak\u refs
并不耗时,并且具有
O(1)
复杂性。因此,唯一需要考虑的是
庞大的
数组的内存大小

我现在也不在乎计算
结果所需的时间

如果
巨大
是一个普通数组,那么它当然可能不适合内存

但如果WeakRef被用作该数组的元素,会有帮助吗?因此,在我们对元素
x
进行迭代之后,可以对其进行垃圾收集以释放一些内存


此场景的开销是多少?有其他选择吗?

为什么在这里使用弱引用?它们不会有帮助,也不是为这种情况设计的


相反,设置一个迭代器(一个响应
每个
的对象),将数据分块加载。

WeakRef的成本可能非常高。WeakRef扩展了Delegator类,在1.8实现中,Delegator对象非常重。每次实例化委托器时,包装对象中的每个方法都会重新定义。使用委托器包装字符串将分配约2800个对象,并使用约90K内存。这使得WeakRef在许多情况下无法使用,因为它们的创建速度非常慢,并且可能比它们所指向的对象使用更多的内存

Delegator已经在1.9Ruby代码中修复,但是,存在一个漏洞,WeakRef可能最终指向错误的对象,因此它们的使用是不安全的


如果要使用弱引用,可以使用ref-gem(https://rubygems.org/gems/ref). 这个gem降低了在块中加载数据的开销,只要使用
maging
变量,它仍将所有对象保留在内存中。但是您的过程是迭代的,所以您不需要将整个
maging
存储在内存中,对吗?