gpt4 book ai didi

ruby - Ruby 中 WeakRef 的成本是多少?

转载 作者:数据小太阳 更新时间:2023-10-29 08:41:25 25 4
gpt4 key购买 nike

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

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

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 数组的内存大小。

目前我也不关心计算结果所需的时间。

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

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

这个场景的开销是多少?还有其他选择吗?

最佳答案

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

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

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

关于ruby - Ruby 中 WeakRef 的成本是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4137623/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com