我有一个我想要压缩的对象。它的形式是
[
{
array
string
},
{
array
string
},
...
]
数组的长度不超过10-15,与字符串相比非常小(它们是html,长度大约为170k)。虽然字符串通常是重复的,或者有大量的重叠。所以我的直觉告诉我压缩值应该是1个字符串的压缩值,加上一点额外的。
我JSON.stringify这个对象并尝试压缩。
大多数压缩库在压缩字符串方面表现不佳,因为服务器向我发送了一个77kb的gzip压缩版本,我知道它至少可以这么小。
的gzip-JS
LZMA-JS
在我尝试过的15个库中做得不错。
问题是gzip-js在字符串数量上是线性的。但是lzma正确地做到了这一点,它只是略微增加了尺寸。
当压缩7mbs(约30~字符串)时,Lzma-js(2级)很慢(20s vs 1s gzip)。
那里有一个compressopn库,大致和gzip一样快,但不能在重复字符串上线性扩展吗?
答案 0 :(得分: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-string更快 在您的数据样本上检查这个 https://github.com/pieroxy/lz-string
答案 1 :(得分:1)
Pako对我有用,试一试:
使用byteArrays而不是使用字符串ID,就像完成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格式发送时,Array会占用大量开销。同样解码:
// 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。