【问题标题】:Ruby string size in MBRuby 字符串大小(以 MB 为单位)
【发布时间】:2017-12-12 12:55:36
【问题描述】:

这可能是一个简单的问题。但是我只是想知道如何在 ruby​​ 中创建一个字符串或数组,以便我知道它有 1MB 大。或者任何尺寸。

【问题讨论】:

  • 1M 字符字节 ("a" * 10**6) 还是实际使用的内存?
  • 假设我想将数据作为字符串消息发送到服务器以进行一些测试。我希望能够发送 1 MB 和 10MB 大小的数据。所以一个字符是1个字节?
  • 不,不能保证一个字符是一个字节。 Ruby 实现可以随意实现字符串。另请注意,对于以 UTF-32 或 UTF-16 编码的字符串,字符通常大于一个字节。
  • 嗯 ok, 然而, "ok".bytesize => 2 那么这意味着它仍然不是2个字节?

标签: arrays ruby string size


【解决方案1】:

这是不可能的。 Ruby 语言规范仅指定字符串的行为,而不是它们的存储方式。例如,对于压缩字符串的实现(在这种情况下,内存中字符串的大小将比您想象的要小),对它们进行重复数据删除(在这种情况下,大小将为 0)是完全合法的。例如,Rubinius 将字符串存储为 ropes,据我所知,这意味着字符串的一部分可能与其他字符串的一部分共享,因此“大小”的概念甚至不好- 在这种情况下定义。

【讨论】:

    【解决方案2】:

    创建一百万个字符的字符串:

    "a" * 10**6
    

    如果您希望它阅读良好并且正在使用 Rails,或者不介意要求 active_support/core_ext,那么您可以执行以下操作:

    "a" * 1.megabyte
    "a" * 10.megabytes
    

    这使用了兆字节的传统定义(2 的幂而不是 10)。

    请注意,这是假设您将 ASCII 字符发送到服务,而不是试图估计 Ruby 如何存储它们。

    【讨论】:

      【解决方案3】:

      如今,您可以使用 capacity: 关键字参数设置内部字符串缓冲区的大小。如果您事先知道 String 的大小,那就太好了,因为这样您就不需要重新分配,因为您反复铲。

      String.new(capacity: 10**6)
      

      【讨论】:

        猜你喜欢
        • 2019-03-16
        • 2013-04-26
        • 2014-06-12
        • 2011-06-17
        • 2013-02-06
        • 1970-01-01
        • 1970-01-01
        • 2012-02-17
        • 1970-01-01
        相关资源
        最近更新 更多