2015-07-03 81 views
9

我有一个对象,我试图压缩。它的形式是在javascript中压缩的问题

[ 
    { 
    array 
    string 
    }, 
    { 
    array 
    string 
    }, 
    ... 
] 

所述阵列并不比在长度10-15更,极小相比于字符串(它们是HTML格式,在长度大致170K)。字符串虽然通常重复,或有大量的重叠。所以我的直觉告诉我,压缩的值应该是1个字符串的压缩值,再加上一点额外的值。

I JSON.stringify此对象并尝试压缩。

大多数压缩库在压缩字符串方面做得不好,因为服务器向我发送了77kb的gzip压缩版本,我知道它至少可以这么小。

用gzip JS

LZMA-JS

的工作做得很好了,也许15库我试过的。

问题是gzip-js在字符串数量上是线性的。但是lzma正确地做到了这一点,只是略微增加了一些。

当压缩7mbs(大约30个字符串)时,Lzma-js(等级2)很不幸(20s vs 1s gzip)非常缓慢。

是否有一个compressopn库在那里,这大致与gzip一样快,但不会重复字符串线性缩放?

+1

你能列出那些你尝试过的不好的工作吗?它肯定会保存我们重置的时间,而不必执行您已经完成的相同工作。 –

+0

你看过http://stackoverflow.com/questions/4570333/string-compression-in-javascript的答案吗?评分最高的回答链接到这个页面http://pieroxy.net/blog/pages/lz-string/index.html,其中引用了一些lz压缩库lib –

+0

如果你有一些时间你可以将位转换为图像(每3位作为像素),并保存为PNG无损图像,最佳性能与非常好的压缩 –

回答

1

使用gzip的-JS LIB具有高压缩级别
https://github.com/beatgammit/gzip-js

var gzip = require('gzip-js'), 
    options = { 
     level: 9, 
     name: 'hello-world.txt', 
     timestamp: parseInt(Date.now()/1000, 10) 
    }; 

// out will be a JavaScript Array of bytes 
var out = gzip.zip('Hello world', options); 

我发现这种方式作为最小的与正常时间更多钞票大小

以及基于LZ压缩算法我觉得LZ - 字符串更快
检查您的数据示例
https://github.com/pieroxy/lz-string

1

Pako对我来说是有用的,试试看:

而不是使用字符串id使用byteArrays,就像它完成here

获取pako.js,你可以解压缩的ByteArray像这样:

<html> 
<head> 
<title>Gunzipping binary gzipped string</title> 
<script type="text/javascript" src="pako.js"></script> 
<script type="text/javascript"> 

// Get datastream as Array, for example: 
var charData = [31,139,8,0,0,0,0,0,0,3,5,193,219,13,0,16,16,4,192,86,214,151,102,52,33,110,35,66,108,226,60,218,55,147,164,238,24,173,19,143,241,18,85,27,58,203,57,46,29,25,198,34,163,193,247,106,179,134,15,50,167,173,148,48,0,0,0]; 

// Turn number array into byte-array 
var binData  = new Uint8Array(charData); 

// Pako magic 
var data  = pako.inflate(binData); 

// Convert gunzipped byteArray back to ascii string: 
var strData  = String.fromCharCode.apply(null, new Uint16Array(data)); 

// Output to console 
console.log(strData); 

</script> 
</head> 
<body> 
Open up the developer console. 
</body> 
</html> 

运行例如:http://jsfiddle.net/9yH7M/

另外,您可以Base64编码的阵列在发送前在为数组占用了大量的开销当作为JSON或XML发送时。同样解码:

// Get some base64 encoded binary data from the server. Imagine we got this: 
var b64Data  = 'H4sIAAAAAAAAAwXB2w0AEBAEwFbWl2Y0IW4jQmziPNo3k6TuGK0Tj/ESVRs6yzkuHRnGIqPB92qzhg8yp62UMAAAAA=='; 

// Decode base64 (convert ascii to binary) 
var strData  = atob(b64Data); 

// Convert binary string to character-number array 
var charData = strData.split('').map(function(x){return x.charCodeAt(0);}); 

// Turn number array into byte-array 
var binData  = new Uint8Array(charData); 

// Pako magic 
var data  = pako.inflate(binData); 

// Convert gunzipped byteArray back to ascii string: 
var strData  = String.fromCharCode.apply(null, new Uint16Array(data)); 

// Output to console 
console.log(strData); 

运行例如:http://jsfiddle.net/9yH7M/1/

对于更高级的功能,请阅读pako API documentation