24

非表示の入力フィールドの値として YAML を送信する Web アプリケーション (Ruby on Rails) があります。

ここで、ブラウザーに送信されるテキストのサイズを縮小したいと考えています。最小限のデータを送信するロスレス圧縮の最も効率的な形式は何ですか? サーバー側で圧縮と解凍の追加コストが発生しても問題ありません。

4

1 に答える 1

64

ruby コアで zlib 実装を使用して、データを in/de-flate することができます。

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 はここで非常に効果的です。通常、実際のデータはそれほど繰り返されません。
于 2013-07-26T14:10:29.860 に答える