最近写一个人体识别需求,哎,新领导要求1-2个星期写完前领导好几个月写的东西,急得我是天天加班到深夜还失眠,人都快要废了,更上头的大佬以为只是原先的地方加需求,哪个知道新领导根本就换了一整套开发框架,完全摒弃了我们公司的开发框架,用他自己一以前公司的技术框架了,而且还什么都没搭好,就一个空壳什么都要自己从新搭建,真鸡儿坑,好了,就吐槽这么多,下面开始干活分享:
首先是我们需要存储人体的特征值一个float数组,算法通过grpc给我的时候是个sting,我们之前是转成float数组后保存并在Java和数据库间流转的,这样会带来两个问题:1.float丢精度(这个问过前领导了,这种丢精度对识别分数只有零点几分到一至两分的影响可以忽略不计),2.数据库存储一条特征值在20多KB。所以想了个办法压缩一下,用byte数组流转与存储,终于降到9KB左右了,但那是string转的byte还是有优化空间的,最后通过io原生API成功降到了6KB多,下面看看float数组与byte数组相互转化的代码(其实下面这两段代码来自同事的友情赞助,网上搜索到的那个位运算的根本没用):
private static float[] byteArrayToFloatArray(byte[] data) {
ByteArrayInputStream bas = new ByteArrayInputStream(data);
DataInputStream ds = new DataInputStream(bas);
float[] fArr = new float[data.length / 4];
try {
for (int i = 0; i < fArr.length; i++) {
fArr[i] = ds.readFloat();
}
} catch (IOException e) {
e.printStackTrace();
}
return fArr;
}
private static byte[] floatArrayToByteArray(float[] data) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(out);
for (int i = 0; i < data.length; i++) {
try {
dataOutputStream.writeFloat(data[i]);
} catch (IOException e) {
e.printStackTrace();
}
}
return out.toByteArray();
}