Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么时候不使用Ruby中的符号?_Ruby_String_Symbols_String Interning - Fatal编程技术网

什么时候不使用Ruby中的符号?

什么时候不使用Ruby中的符号?,ruby,string,symbols,string-interning,Ruby,String,Symbols,String Interning,我有一个来自分析提供商的大型数据集 它以JSON的形式出现,我将其解析为一个散列,但由于集合的大小,我的内存使用量膨胀到了一个gig以上。几乎所有的东西都是以字符串开始的(一些值是数字的),当然键会重复很多次,但许多值也会重复 所以我在想,为什么不把所有的(非数字的)值也符号化呢 我发现了一些潜在问题的讨论,但我认为对Ruby有一个全面的描述会很好,因为这些问题似乎取决于实习过程的实现(当你符号化一个字符串时会发生什么) 我发现这是关于Java的: 实习过程可能很昂贵 插入的字符串永远不会取

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

它以JSON的形式出现,我将其解析为一个散列,但由于集合的大小,我的内存使用量膨胀到了一个gig以上。几乎所有的东西都是以字符串开始的(一些值是数字的),当然键会重复很多次,但许多值也会重复

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

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

我发现这是关于Java的:

  • 实习过程可能很昂贵
  • 插入的字符串永远不会取消分配,从而导致内存泄漏
(除了最后一点有争议。)

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

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

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

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

    {name: "my name"}
    
  • 冻结字符串为节省内存,请尝试保留一个小字符串池

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

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

  • 。因此,这种担忧不再有效。但是,过度使用冻结的字符串和符号会降低性能

你能提供一些关于开集和闭集的例子吗?我使用的术语是语言学意义上的。补充说明。