我以为我会在几个小时后进行不确定的研究和测试:
我正在尝试将非常大的Double
数组从应用程序发送到服务器,当然,我想尽可能地压缩它。
具体来说,这些数组包含CMDeviceMotion
个组件(加速度,x,y,z,陀螺仪等......),但这个问题应该适用于任何大数字(超过100K或一百万个值)
假设我有一大堆Double
(还有很多其他人):
var CMX = CM.map({$0.userAcceleration.x})
此处,CMX
的类型为[Double]
,CM
为[CMDeviceMotion]
我尝试通过以不同方式发送POST
来向我的服务器发出CMX
个请求,然后在服务器上收到后计算总大小:
{"AX":"-0.0441827848553658,-0.103976868093014,-0.117475733160973,-0.206566318869591,-0.266509801149368,-0.282151937484741,-0.260240525007248,-0.266505032777786,-0.315020948648453,-0.305839896202087,0.0255246963351965,0.0783950537443161,0.0749507397413254,0.0760494321584702,-0.0101579604670405,0.106710642576218,0.131824940443039,0.0630970001220703,0.21177926659584,0.27022996544838,0.222621202468872,0.234281644225121,0.288497060537338,0.176655143499374,0.193904414772987,0.169417425990105,0.150193274021149,0.00871349219232798,-0.0270088445395231,-0.0 ....
大小153 Kb。
这比作为二进制数据发送更大是有道理的,因为这里的单个数字是64位(8字节),并且变为17字节长(每个字符一个字节)+1 = 18(添加了一个字符用于逗号)。
有了这个推理,将数组作为二进制数据发送应该更小。
在这里,我使用Data
将数组转换为NSKeyedArchiver
对象,并在发送数据之前对数据进行64位编码:
["AX":NSKeyedArchiver.archivedData(withRootObject:CM.map({$0.userAcceleration.x})).base64EncodedString()]
这使文件大小为206 Kb
只需发送:
["AX": CM.map({$0.userAcceleration.x})]
事实证明,这个数字数组实际上已经转换为逗号分隔的字符串,大小最终与试验1(160Kb)相同
Data
,不带base 64编码这样做:
["AX":NSKeyedArchiver.archivedData(withRootObject:CM.map({$0.userAcceleration.x}))
使应用程序在运行时崩溃,因此我无法将Data
对象作为JSON中的值发送
如何在JSON对象中以更精简的方式发送这些数组?
请注意,我已经考虑了下采样,并使用32位浮点数来减小大小。
答案 0 :(得分:1)
简单的方法就是这样做:
$('.js-daterangepicker').daterangepicker({
});
你有二进制缓冲区,所有的双打/浮动组合在一起。
但由于HTTP是基于文本的协议,因此您必须将此let data: Data = CMX.withUnsafeBufferPointer { pointer in
return Data(buffer: pointer)
}
转换为base64字符串:
data
这个let base64String = data.base64EncodedString()
应该传递给base64String
(?) AX
请求的POST
参数。
修改强>:
要将其转换回来,您可以使用以下代码:
HTTP