什么时候不使用Ruby中的符号?
我有一个来自分析提供商的大型数据集 它以JSON的形式出现,我将其解析为一个散列,但由于集合的大小,我的内存使用量膨胀到了一个gig以上。几乎所有的东西都是以字符串开始的(一些值是数字的),当然键会重复很多次,但许多值也会重复 所以我在想,为什么不把所有的(非数字的)值也符号化呢 我发现了一些潜在问题的讨论,但我认为对Ruby有一个全面的描述会很好,因为这些问题似乎取决于实习过程的实现(当你符号化一个字符串时会发生什么) 我发现这是关于Java的:什么时候不使用Ruby中的符号?,ruby,string,symbols,string-interning,Ruby,String,Symbols,String Interning,我有一个来自分析提供商的大型数据集 它以JSON的形式出现,我将其解析为一个散列,但由于集合的大小,我的内存使用量膨胀到了一个gig以上。几乎所有的东西都是以字符串开始的(一些值是数字的),当然键会重复很多次,但许多值也会重复 所以我在想,为什么不把所有的(非数字的)值也符号化呢 我发现了一些潜在问题的讨论,但我认为对Ruby有一个全面的描述会很好,因为这些问题似乎取决于实习过程的实现(当你符号化一个字符串时会发生什么) 我发现这是关于Java的: 实习过程可能很昂贵 插入的字符串永远不会取
- 实习过程可能很昂贵
- 插入的字符串永远不会取消分配,从而导致内存泄漏
- 当所讨论的事物列表是一个开放集(即,动态的,没有固定的库存)时,您不应该将它们转换为符号。创建的每个符号都不会被垃圾收集,并会导致内存泄漏
- 当所讨论的事物列表是一个封闭集(即,静态的,有固定的库存)时,最好将它们转换为符号。每个符号将仅创建一次,并将重复使用。这样可以节省内存
- 符号是哈希键的最佳选择
{name: "my name"}
- 冻结字符串为节省内存,请尝试保留一个小字符串池
person[:country] = "USA".freeze
- 享受Ruby GC调优的乐趣
- 。因此,这种担忧不再有效。但是,过度使用冻结的字符串和符号会降低性能