gpt4 book ai didi

javascript - javascript 中的压缩问题

转载 作者:数据小太阳 更新时间:2023-10-29 03:56:27 25 4
gpt4 key购买 nike

我有一个要压缩的对象。它的形式是

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

数组的长度不超过 10-15,与字符串相比非常小(它们是 html,长度大约为 170k)。虽然这些字符串通常是重复的,或者有大量的重叠。所以我的直觉告诉我压缩值应该是1个字符串的压缩值,加上一点额外的。

我 JSON.stringify 这个对象并尝试压缩。

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

gzip-js

lzma-js

在我试过的大约 15 个库中做得很好。

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

不幸的是,Lzma-js(2 级)在压缩 7mbs(大约 30~ 字符串)时非常慢(20s vs 1s gzip)。

是否有一个 compressopn 库,其速度大致与 gzip 一样快,但在重复字符串上不能线性扩展?

最佳答案

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 .

关于javascript - javascript 中的压缩问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31211503/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com