【问题标题】:When not to use to_sym in Ruby?什么时候不要在 Ruby 中使用 to_sym?
【发布时间】:2013-04-23 18:10:28
【问题描述】:

我有一个来自分析提供商的大型数据集。

它以 JSON 格式到达,我将其解析为哈希,但由于集合的大小,我的内存使用量激增。几乎所有内容都以字符串开头(一些值是数字),当然键会重复很多次,但许多值也会重复。

所以我在想,为什么不将所有(非数字)值也符号化呢?

我发现了一些关于潜在问题的讨论,但我认为对 Ruby 有一个全面的描述会很好,因为这些问题似乎取决于实习过程的实现(当你符号化一个字符串时会发生什么)。

我发现这是在谈论 Java: Is it good practice to use java.lang.String.intern()?

  • 实习过程可能很昂贵
  • 从不释放内部字符串,从而导致内存泄漏

(除了最后一点存在争议。)

那么,谁能详细解释一下什么时候不要在 Ruby 中实习字符串?

【问题讨论】:

    标签: ruby string symbols string-interning


    【解决方案1】:
    • 当有问题的事物列表是开放集(即动态的,没有固定库存)时,您不应将它们转换为符号。创建的每个符号都不会被垃圾回收,并且会导致内存泄漏。
    • 当有问题的事物列表是一个封闭集(即静态的,具有固定库存)时,您最好将它们转换为符号。每个符号只会被创建一次,并且会被重复使用。这样可以节省内存。

    【讨论】:

    • 你能提供一些关于开集和闭集的例子吗?
    • 我使用了语言意义上的术语。添加说明。
    【解决方案2】:

    实习过程可能很昂贵

    我们必须在内存和计算能力之间进行权衡。因此,请尝试一些最佳实践并进行基准测试以找出适合您的方法。我想提一些建议..

    • 符号是哈希键的绝佳选择

      {name: "my name"}
      
    • 冻结字符串以节省内存,尽量保持一个小的字符串池

      person[:country] = "USA".freeze
      
    • 享受 Ruby GC 调优的乐趣。

    内部字符串永远不会被释放,导致内存泄漏

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-29
      • 2011-05-03
      • 1970-01-01
      • 1970-01-01
      • 2012-09-16
      • 2013-05-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多