在 JSON 中手动"compressing"大量布尔值



我们有一个数据模型,其中每个实体都有600个布尔值。所有这些数据都需要通过JSON从node.js后端传输到Angular前端。

我在考虑各种方法来优化它(这是一个内部API,不是公开的,所以遵守最佳实践不如性能和节省带宽重要(。

我不是一个母语为Javascript的人,所以我希望能得到一些关于我正在考虑的一些选项的反馈,这些选项是:

  • 将其转换为一个位字段,并使用一个巨大的(600位(BigInt

    这是可行的方法吗?我可以想象,就的性能而言,这可能会非常可怕

  • 将600位拆分为10个整数(因为JS整数是64位(,并将它们放入JSON 中的数组中

  • Base64编码二进制blob(我假设会解码为UInt8Array?(

  • 使用Protobuf之类的东西?这可能有些过头了,因为我不想在这个优化上花费超过1-2个小时;也绝对不想对体系结构进行重大更改

附带说明:由于基础设施的原因,我们没有在服务器端进行压缩,这使得压缩更加复杂,也是我们在数据级别实现压缩的原因

谢谢!

正如Evan所指出的,例如,将布尔值转换为true="t〃;并且false="0";f";,600布尔值将变成一个由600个字符组成的连接字符串,可以很好地拆分为3个大小为200的字符串,然后一旦在前面收到,就连接传输,如果你想恢复你的Bollean值​​从字符串中,只需一个简单的reg就可以实现。我不知道数据是如何设置和获取的,只是将这个参数更改为我认为需要自动化的参数。一旦在前面获得了最后一个字符串,这里有一个reg ex的例子,它可以将您的字符串转换为具有600布尔值的数组。也可以通过定义对象而不是数组来定义索引。

function convert_myBool(str)
{
/*var reg = new RegExp('.{1}', 'g');
var tmpTab = str.replace(reg, function(matched){
return matched == "t"?true:false;
});*/
//map is best 
tmpTab = str.split('').map((value) =>{
return value == "t"?true:false;
});
return tmpTab;
};

我动态地写了这篇文章,所以它当然可以被思考、改进和替换。希望能有所帮助:(

它可以用任何方式排序吗?如果存在总是与相关值一起出现的布尔值,则可以将它们分组并进行简化。

根据您对这些数据的使用情况,您可能可以缓存其中的一些数据或根据使用频率进行存储。然而,缓存在空间上会有所取舍。

最新更新