代码之家  ›  专栏  ›  技术社区  ›  Dmytrii Nagirniak

用红宝石做WeakRef要多少钱?

  •  2
  • Dmytrii Nagirniak  · 技术社区  · 15 年前

    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 阵列。

    result .

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

    但如果WeakRef被用作这个数组的元素会有帮助吗?所以在我们遍历一个元素之后 x

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

    2 回复  |  直到 15 年前
        1
  •  1
  •   glebm    15 年前

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

    而是设置一个迭代器(一个响应 each

        2
  •  3
  •   Brian Durand    15 年前

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

    Delegator在1.9ruby代码中已经被修复,但是,有一个错误,WeakRef的可能会指向错误的对象,因此它们的使用是不安全的。

    推荐文章