記一次float數(shù)組與byte數(shù)組轉(zhuǎn)換并優(yōu)化數(shù)據(jù)存儲

最近寫一個人體識別需求,哎,新領(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();
    }





?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容