ruby - remove - rails strip_tags in controller



Сжатие большой строки в рубине (1)

У меня есть веб-приложение (ruby on rails), которое отправляет некоторый YAML в качестве значения скрытого поля ввода.

Теперь я хочу уменьшить размер текста, который отправляется в браузер. Какова наиболее эффективная форма сжатия без потерь, которая отправляет минимальные данные? Я в порядке, чтобы нести дополнительные расходы на сжатие и распаковку на стороне сервера.


Вы можете использовать реализацию zlib в ядре ruby ​​для ввода / удаления данных:

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 (zlib-порт для javascript), чтобы вернуть ваши данные. Этот ответ, вероятно, поможет вам в реализации части 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. Но я не пробовал это.
  • Цифры о размерах строк немного обмануты. Злеб действительно эффективен здесь, потому что строка повторяется много раз . Реальные данные обычно не повторяются так сильно.




compression