2

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

我要执行的任务是这样的:

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_array_of_weak_refs不耗时且具有O(1)复杂性。所以唯一关心的是huge数组的内存大小。

我现在也不关心计算result.

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

但是,如果将 WeakRef 用作该数组的元素会有所帮助吗?因此,在我们迭代了一个元素之后x,它可以被垃圾收集以释放一些内存。

这种情况的开销是多少?有什么选择吗?

4

2 回答 2

3

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

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

如果你想使用弱引用,你可以使用 ref gem (https://rubygems.org/gems/ref)。这个 gem 将每个引用的开销降低到 <1K 的内存。如果您使用 Jruby 或 Rubinius,实现会更加高效。

于 2011-01-11T16:59:15.923 回答
1

为什么要在这里使用弱引用?它们无济于事,也不是为这种情况而设计的。

而是设置一个迭代器(一个响应 的对象each),以块的形式加载数据。

于 2010-11-09T19:56:30.780 回答