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

Nar*_*tor 2 ruby string symbols string-interning

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

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

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

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

我发现这是在谈论 Java: 使用 java.lang.String.intern() 是好习惯吗?

  • 实习过程可能很昂贵
  • 实习字符串永远不会被取消分配,从而导致内存泄漏

(除了对最后一点有一些争论。)

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

saw*_*awa 6

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