【问题标题】:Is there a theoretical limit to the number of objects Ruby can store?Ruby 可以存储的对象数量是否有理论上的限制?
【发布时间】:2015-05-29 10:10:23
【问题描述】:

至少比20_000_000多一点,数字的object_ids是数字的2倍+1:

1454.object_id # => 2909

在大数上调用object_id 时,不会保留此格式。理论上您可以拥有的对象数量似乎存在内置限制。我跑了:

ids = []
100_000_000.times { ids << String.new.object_id }
ids.max # => 22314984
ids.uniq.count # => 44301

因此,在 100,000,000 个字符串对象中,实际上只有大约 50,000 个是唯一的。这意味着这些对象中有 99.95% 是同一个对象。我不确定这是为什么。

【问题讨论】:

  • 我认为这是受服务器内存数量的限制,但这只是我的意见。
  • 刚刚运行了这个。不,它没有引发任何错误。我怀疑它是否有帮助,假设的限制可能会更高。
  • 您在没有MemoryAllocationError 的情况下运行此代码?
  • 您可能想阅读答案given here
  • 您创建了 100000000 个字符串,但它们不是同时存在的。您的数组仅存储它们的 ID,而字符串未被引用。现在 GC 可能会收集它们,如果发生这种情况,一个新对象可以与已收集的对象具有相同的 ID,因为它的插槽是空闲的。

标签: ruby oop object objectid


【解决方案1】:

如何分配对象 ID 取决于实现。在 C-ruby 上,对象 id 只是对象的内存地址的数值(除了一些立即数的例外,例如 true、false、nil、Fixnums)。

因此,两个活动对象不能共享同一个对象 ID(很好!),但是如果您触发垃圾回收,则某些内存位置(即堆槽)可能会被重用,因此对象 ID 也是如此。

另一个后果是您永远不会用完对象 ID(除非您耗尽了进程的地址空间,但如果发生这种情况,您无论如何都会遇到麻烦)

【讨论】:

  • 作为参考,thisobject_id 在当前 MRI 中的实现方式。
猜你喜欢
  • 2011-05-06
  • 1970-01-01
  • 2013-07-22
  • 1970-01-01
  • 2019-04-11
  • 1970-01-01
  • 2014-01-05
  • 2019-07-12
  • 2017-10-26
相关资源
最近更新 更多