web-dev-qa-db-ja.com

JavaScriptでの文字列圧縮

文字列を指定すると、圧縮された(短い)文字列を返すJavaScript関数を探しています。

私はChrome=長い文字列(HTML)をローカルデータベースに保存するWebアプリケーションを開発しています。テスト目的で、データベースを格納するファイルをZip圧縮しようとしましたが、5倍に縮小されましたなので、格納するものを圧縮すると、データベースを小さく保つのに役立つと考えました。

JavaScriptでLZSSの実装を見つけました: http://code.google.com/p/u-lzss/ ( "U-LZSS")。

短いサンプル文字列(デコード===エンコード)を使用して「手動」でテストしたところ、動作するようでしたが、Chromeでもかなり高速です。しかし、大きな文字列(100 ko)を指定すると、文字列の後半が文字化け/混ざり合うように見えます。

U-LZSSが短い文字列を期待し、より大きな文字列を処理できない可能性はありますか?そして、その上限を移動するためにいくつかのパラメータを調整することは可能でしょうか?

35
Bambax

Piskvorの提案で、私はこの質問への回答で見つかったコードをテストしました: GzipのJavaScript実装 (上位投票された回答:LZW実装):

  1. できます
  2. データベースのサイズを2分の1に削減します

...これは5未満ですが、何もないよりはましです!だから私はそれを使いました。

(Piskvorからの回答を受け入れることができればよかったのですが、それはコメントにすぎませんでした)。

5
Bambax

既存の実装のどれも私のニーズを満たしていなかったため、私は小さな [〜#〜] lzw [〜#〜] 実装をリリースしました。

これは私が今後使用するものであり、おそらくいつかライブラリを改善しようとするでしょう。

30
pieroxy

これは、完全に機能するデモでLZWから変更したエンコード(276バイト、関数en)関数とデコード(191バイト、関数de)関数です。私がここであなたに与えているものよりもインターネット上で利用可能なより小さな、またはより速いルーチンはありません。

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>');
7
Dave Brown

私にとって、宛先としてUTF-8を使用して文字列を圧縮することは理にかなっていないようです...単に問題を探しているように見えます。圧縮をなくして、7ビットの単純なASCIIを宛先として使用する方が良いと思います。

おもちゃで 4 KB JavaScriptデモ おもしろいように書いた圧縮結果にエンコードを使用して、4つのバイナリバイトをASCIIのサブセットから選択された5つの文字に格納しましたJavaScript文字列に埋め込むのに適した85文字(85 ^ 5は8 ^ 4よりわずかに大きいが、JavaScript整数の精度に収まる)これにより、たとえば [〜# 〜] json [〜#〜] エスケープする必要はありません。

5
6502

lz-string も検討する必要があると思います。圧縮は非常に高速で、ページにリストされているいくつかの利点があります。

他のライブラリはどうですか?

  • 一部のLZW実装では、数値の配列が返され(トークンが64ビットを取るため、保存するのが非常に非効率的)、255を超える文字はサポートされません。
  • 文字列を返す他のいくつかのLZW実装(格納するのはそれほど効率的ではありませんが、すべてのトークンは16ビットを使用します)で、255を超える文字はサポートされません。
  • 非同期で非常に遅いLZMA実装-しかし、ちょっと、それはLZMAであって、遅い実装ではありません。
  • gZip実装は、実際にはブラウザー向けではなく、70キロバイトの加重(nodeはdeflate.jsとcrc32.jsが依存する)向けです。

著者がlz-stringを作成した理由:

  • モバイルでの作業には、何か速いものが必要でした。
  • 私のWebサイトの外部から収集した文字列を使用して、255を超えるUTF文字を含む、あらゆる種類の文字列を入力として受け取ることができるものが必要でした。
  • 70kbを使用しないライブラリは決定的なプラスでした。 localStorageに格納するために可能な限りコンパクトな文字列を生成するもの。したがって、オンラインで見つけることができたどのライブラリも私のニーズにうまく機能しませんでした。

他の言語でのこのlibの実装があります。現在pythonの実装を調査していますが、現時点では解凍に問題があるようですが、JSに固執する場合は非常によく見えます私に。

1
Nils Ziehn

次のものは必ずしも成り立たないと思うので、何かを実装する前にテキストファイルを試してみてください。

そのため、データベースに格納されているものを圧縮すると、データベースを小さく保つのに役立つと考えました。

ロスレス圧縮アルゴリズムは繰り返しパターン(空白など)に非常に適しているためです。

1
cherouvim

圧縮/解凍APIの提案があるようです https://github.com/wicg/compression/blob/master/explainer.md

https://blog.chromium.org/2019/12/chrome-80-のブログ投稿によると、Chrome 80(現在ベータ版))に実装されていますcontent-indexing-es-modules.html

ストリームと文字列の間で適切な変換を行っているかどうかはわかりませんが、新しいAPIを使用しようとしています。

    var encoding = 'deflate'; // or 'gzip'

    function compress(text) {
      var byteArray = new TextEncoder().encode(text);
      var cs = new CompressionStream(encoding);
      var writer = cs.writable.getWriter();
      writer.write(byteArray);
      writer.close();
      return new Response(cs.readable).arrayBuffer();
    }

    function decompress(byteArray) {
      var cs = new DecompressionStream(encoding);
      var writer = cs.writable.getWriter();
      writer.write(byteArray);
      writer.close();
      return new Response(cs.readable).arrayBuffer().then(function (arrayBuffer) {
        return new TextDecoder().decode(arrayBuffer);
      });
    }
    
    var test = "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";

    console.time('compress');
    compress(test).then(function (x) {
      console.timeEnd('compress');
      console.log('compressed length', x.byteLength);
      console.time('decompress');
      decompress(x).then(function (y) {
        console.timeEnd('decompress');
        console.log('decompressed length', y.length);
        console.assert(test === y);
      });
    });
0
4esn0k