什么时候不在Ruby中使用to_sym?

时间:2013-04-29 22:42:29

标签: ruby string symbols string-interning

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

它到达JSON并将其解析为散列,但由于集合的大小,我正在膨胀到内存使用量的演出。几乎所有东西都以字符串开头(一些值是数值),当然,密钥重复多次,但很多值也会重复。

所以我在思考,为什么不象征所有(非数字)值呢?

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

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

  • 实习过程可能很昂贵
  • 内部字符串永远不会被解除分配,导致内存泄漏

(除了最后一点有争议。)

那么,任何人都可以详细解释何时不在Ruby中实习字符串?

2 个答案:

答案 0 :(得分:4)

  • 当有问题的列表是开放式集合(即动态,没有固定库存)时,您不应将它们转换为符号。创建的每个符号都不会被垃圾回收,并且会导致内存泄漏。
  • 当有问题的列表是封闭集(即静态,具有固定库存)时,您应该更好地将它们转换为符号。每个符号只会创建一次,并将被重用。这样可以节省内存。

答案 1 :(得分:1)

  

实习过程可能很昂贵

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

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

    {name: "my name"}
    
  • 冻结字符串以节省内存,尝试保留小的字符串池

    person[:country] = "USA".freeze
    
  • 在Ruby GC调优方面很有趣。

  

永远不会取消分配内部字符串,从而导致内存泄漏