在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
存储在内存中,对吗?