2

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

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

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

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

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

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

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

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

4

2 回答 2

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

实习过程可能很昂贵

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

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

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

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

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

于 2018-12-22T20:03:40.873 回答