压缩Ruby中的大字符串

eqqqjvef  于 2022-11-04  发布在  Ruby
关注(0)|答案(2)|浏览(124)

我有一个Web应用程序(ruby on rails),它发送一些YAML作为隐藏输入字段的值。
现在我想减少发送到浏览器的文本的大小。什么是最有效的无损压缩形式,将发送最少的数据?我可以在服务器端产生额外的压缩和解压缩成本。

juzqafwq

juzqafwq1#

您可以在ruby核心中使用zlib实现来输入/消除数据:

require "zlib"
data = "some long yaml string" * 100
compressed_data = Zlib::Deflate.deflate(data)

# => "x\x9C+\xCE\xCFMU\xC8\xC9\xCFKW\xA8L\xCC\xCDQ(.)\xCA\xCCK/\x1E\x15\x1C\x15\x1C\x15\x1C\x15\x1C\x15\x1C\x15\x1C\x15\x1C\x15D\x15\x04\x00\xB3G%\xA6"

您应该对压缩数据进行base64编码以使其可打印:

require 'base64'
encoded_data = Base64.encode64 compressed_data

# => "eJwrzs9NVcjJz0tXqEzMzVEoLinKzEsvHhUcFRwVHBUcFRwVHBUcFUQVBACz\nRyWm\n"

稍后,在客户端,您可能会使用pako(javascript的zlib端口)取回数据,这个答案可能有助于实现JS部分。
下面是示例字符串的大小,给予您了解一下它的效果:

data.size            # 2100
compressed_data.size #   48
encoded_data.size    #   66

当在客户机上压缩而在服务器上膨胀时,情况也是如此。

Zlib::Inflate.inflate(Base64.decode64(encoded_data))

# => "some long yaml stringsome long yaml str ... (shortened, as the string is long :)

免责声明:

  • ruby zlib实现 * 应该 * 与pako实现兼容,但是我还没有尝试过。
  • 关于字符串大小的数字有点欺骗。Zlib在这里真的很有效,因为字符串重复 * 很多 *。现实生活中的数据通常不会重复那么多。
vdzxcuhz

vdzxcuhz2#

如果您正在使用Rails应用程序,您还可以使用ActiveSupport::Gzip Package 器,它允许使用gzip压缩/解压缩字符串。

compressed_log = ActiveSupport::Gzip.compress('large string')
=> "\x1F\x8B\b\x00yq5c\x00\x03..."

original_log = ActiveSupport::Gzip.decompress(compressed_log)
=> "large string"

在后台,compress方法使用Zlib::GzipWriter类来写入gzip文件,类似地,解压缩方法使用Zlib::GzipReader类来读取gzip文件。

相关问题