最近寫一個人體識別需求,哎,新領(lǐng)導(dǎo)要求1-2個星期寫完前領(lǐng)導(dǎo)好幾個月寫的東西,急得我是天天加班到深夜還失眠,人都快要廢了,更上頭的大佬以為只是原先的地方加需求,哪個知道新領(lǐng)導(dǎo)根本就換了一整套開發(fā)框架,完全摒棄了我們公司的開發(fā)框架,用他自己一以前公司的技術(shù)框架了,而且還什么都沒搭好,就一個空殼什么都要自己從新搭建,真雞兒坑,好了,就吐槽這么多,下面開始干活分享:
首先是我們需要存儲人體的特征值一個float數(shù)組,算法通過grpc給我的時候是個sting,我們之前是轉(zhuǎn)成float數(shù)組后保存并在Java和數(shù)據(jù)庫間流轉(zhuǎn)的,這樣會帶來兩個問題:1.float丟精度(這個問過前領(lǐng)導(dǎo)了,這種丟精度對識別分?jǐn)?shù)只有零點(diǎn)幾分到一至兩分的影響可以忽略不計),2.數(shù)據(jù)庫存儲一條特征值在20多KB。所以想了個辦法壓縮一下,用byte數(shù)組流轉(zhuǎn)與存儲,終于降到9KB左右了,但那是string轉(zhuǎn)的byte還是有優(yōu)化空間的,最后通過io原生API成功降到了6KB多,下面看看float數(shù)組與byte數(shù)組相互轉(zhuǎn)化的代碼(其實(shí)下面這兩段代碼來自同事的友情贊助,網(wǎng)上搜索到的那個位運(yùn)算的根本沒用):
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();
}