Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

В предложении Piskvor я проверил код, найденный в ответе на этот вопрос: JavaScript-реализация Gzip (верхний голос: реализация LZW) и обнаружил, что:

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

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

(Жаль, что я не мог принять ответ Piskvor, но это был только комментарий).

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

Вот кодировка (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>');

Ответ 5

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

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

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

Ответ 6

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

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

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

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

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

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