Сжатие строк в JavaScript - PullRequest
       19

Сжатие строк в JavaScript

31 голосов
/ 31 декабря 2010

Я ищу функцию JavaScript, которая по заданной строке возвращает сжатую (более короткую) строку.

Я занимаюсь разработкой веб-приложения Chrome, которое сохраняет длинные строки (HTML) в локальной базе данных.В целях тестирования я попытался сжать файл, хранящий базу данных, и он сократился в пять раз, поэтому я подумал, что это поможет сохранить базу данных меньше, если я сожму вещи, которые она хранит.

Я нашелреализация LZSS в JavaScript здесь: http://code.google.com/p/u-lzss/ ("U-LZSS").

Казалось, что это работает, когда я тестировал его "вручную" с короткими примерами строк (decode === encode), и это довольно быстро, в Chrome.Но когда ему дают большие строки (100 ko), кажется, что он искажает / перепутывает последнюю половину строки.

Возможно ли, что U-LZSS ожидает короткие строки и не может иметь дело с более крупными строками?И можно ли было бы отрегулировать некоторые параметры, чтобы переместить этот верхний предел?

Ответы [ 6 ]

29 голосов
/ 09 мая 2013

Я только что выпустил небольшую реализацию LZW , специально разработанную для этой цели, поскольку ни одна из существующих реализаций не отвечала моим потребностям.

Это то, что я использую в дальнейшем, и я, возможно, постараюсь улучшить библиотеку в какой-то момент.

5 голосов
/ 03 января 2011

По предложению Писквор я протестировал код, найденный в ответе на этот вопрос: Реализация JavaScript в Gzip (голосование с наибольшим количеством голосов: реализация LZW) и обнаружил, что:

  1. работает
  2. уменьшает размер базы данных в два раза

... что меньше 5, но лучше, чем ничего! Так что я использовал это.

(Я бы хотел принять ответ от Писквора, но это был только комментарий).

4 голосов
/ 31 декабря 2010

Мне кажется нецелесообразным сжимать строку, используя UTF-8 в качестве места назначения ... Это выглядит просто как поиск проблемы.Я думаю, что было бы лучше потерять некоторое сжатие и использовать простой 7-битный ASCII в качестве места назначения.

В игрушке 4 КБ JavaScript demo Я написал для удовольствия, я использовал кодировку длярезультат сжатия, в котором четыре двоичных байта хранятся в пяти символах, выбранных из подмножества ASCII из 85 символов, которое является чистым для встраивания в строку JavaScript (85 ^ 5 немного больше, чем 8 ^ 4, но все еще соответствует точности целых чисел JavaScript).Это делает сжатые данные безопасными, например, для JSON без необходимости экранирования.

2 голосов
/ 10 января 2016

Здесь представлены функции кодирования (276 байт, функция en) и декодирования (191 байт, функция de), которые я модифицировал из LZW в полностью рабочей демонстрации. В Интернете нет более мелкой или более быстрой рутины, чем то, что я вам здесь даю.

function en(c){var x='charCodeAt',b,e={},f=c.split(""),d=[],a=f[0],g=256;for(b=1;b<f.length;b++)c=f[b],null!=e[a+c]?a+=c:(d.push(1<a.length?e[a]:a[x](0)),e[a+c]=g,g++,a=c);d.push(1<a.length?e[a]:a[x](0));for(b=0;b<d.length;b++)d[b]=String.fromCharCode(d[b]);return d.join("")}

function de(b){var a,e={},d=b.split(""),c=f=d[0],g=[c],h=o=256;for(b=1;b<d.length;b++)a=d[b].charCodeAt(0),a=h>a?d[b]:e[a]?e[a]:f+c,g.push(a),c=a.charAt(0),e[o]=f+c,o++,f=a;return g.join("")}

var compressed=en("http://www.ScriptCompress.com - Simple Packer/Minify/Compress JavaScript Minify, Fixify & Prettify 75 JS Obfuscators In 1 App 25 JS Compressors (Gzip, Bzip, LZMA, etc) PHP, HTML & JS Packers In 1 App PHP Source Code Packers Text Packer HTML Packer or v2 or v3 or LZW Twitter Compress or More Words DNA & Base64 Packer (freq tool) or v2 JS JavaScript Code Golfer Encode Between Quotes Decode Almost Anything Password Protect Scripts HTML Minifier v2 or Encoder or Escaper CSS Minifier or Compressor v2 SVG Image Shrinker HTML To: SVG or SVGZ (Gzipped) HTML To: PNG or v2 2015 JS Packer v2 v3 Embedded File Generator Extreme Packer or version 2 Our Blog DemoScene JS Packer Basic JS Packer or New Version Asciify JavaScript Escape JavaScript Characters UnPacker Packed JS JavaScript Minify/Uglify Text Splitter/Chunker Twitter, Use More Characters Base64 Drag 'n Drop Redirect URL DataURI Get Words Repeated LZMA Archiver ZIP Read/Extract/Make BEAUTIFIER & CODE FIXER WHAK-A-SCRIPT JAVASCRIPT MANGLER 30 STRING ENCODERS CONVERTERS, ENCRYPTION & ENCODERS 43 Byte 1px GIF Generator Steganography PNG Generator WEB APPS VIA DATAURL OLD VERSION OF WHAK PAKr Fun Text Encrypt Our Google");
var decompressed=de(compressed);

document.writeln('<hr>'+compressed+'<hr><h1>'+compressed.length+' characters versus original '+decompressed.length+' characters.</h1><hr>'+decompressed+'<hr>');
1 голос
/ 29 января 2016

Думаю, вам также стоит взглянуть на lz-string , это быстро сжимает довольно хорошо и имеет некоторые преимущества, которые они перечисляют на своей странице:

А как насчет других библиотек?

  • некоторые реализации LZW, которые возвращают массивы чисел (ужасно неэффективно хранить, так как токены занимают 64 бита) и не поддерживают символы выше 255.
  • некоторые другие LZWреализации, которые возвращают вам строку (менее ужасно неэффективную для хранения, но все же, все токены занимают 16 бит) и не поддерживают какой-либо символ выше 255.
  • реализация LZMA, которая является асинхронной и очень медленной - но эй, это LZMA, а не медленная реализация.
  • реализация GZip на самом деле не предназначена для браузеров, но предназначена для node.js, который весил 70 КБ (с deflate.js и crc32.js, от которых он зависит).

Причины, по которым автор создал lz-string:

  • Работая на мобильном устройстве, мне нужно было что-то быстрое.
  • Для работы со строками, собранными извне моего веб-сайта, мне нужно было что-то, что могло бы принимать любую строку в качестве входных данных, включая любые символы UTF выше 255.
  • Библиотека, не принимающая 70 КБ, была явным плюсом.То, что создает строки настолько компактные, насколько это возможно, для хранения в localStorage.Так что ни одна из библиотек, которые я мог найти в Интернете, не работала для моих нужд.

Существуют реализации этой библиотеки на других языках, в настоящее время я изучаю реализацию на python, но декомпрессия, похоже, имеет проблемына данный момент, но если вы придерживаетесь только JS, это выглядит очень хорошо для меня.

1 голос
/ 31 декабря 2010

Попробуйте поэкспериментировать с текстовыми файлами, прежде чем что-либо реализовывать, потому что я думаю, что следующее не обязательно выполняется:

поэтому я подумал, что это поможет сохранить базу данных меньше, если я сожму вещи, которые она хранит.

Это потому, что алгоритмы сжатия без потерь довольно хороши с повторяющимися шаблонами (например, пробелами).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...