android 端 大型浮点数的存储方案

在做人脸识别本地化方案是,遇到个数据存储的问题。

图片提取到的特征值是一个512 为的float数组,大小为512*4 = 2k

如果转换成字符串进行存储,则数据大小为 512*1*32=16K 放大了8倍。

如果有500条数据的话,就是16*500 = 8M。常见的方式是数据库或者sp,文件

第一,sqlite3最长存储4000个字符,数据库无法存储。

第一,如果存成sp或者文件,读取数据的耗时惊人,存储成sp或者文件都不现实,而且sp文件还会拖慢整体速度。

因而,调研了很长时间,找到一种存储方案。blob,sqlite3开始支持存储blob文件。

核心代码就是将512浮点数转换成bytes数组,再转换回来。代码如下:

    public static byte[] fromFloatToBytes(float[] feat) {
        byte[] byteRet = new byte[2048];
        for (int i = 0; i < feat.length; i++) {
            int accum = Float.floatToRawIntBits(feat[i]);
            byteRet[i*4+0] = (byte) (accum & 0xFF);
            byteRet[i*4+1] = (byte) ((accum >> 8) & 0xFF);
            byteRet[i*4+2] = (byte) ((accum >> 16) & 0xFF);
            byteRet[i*4+3] = (byte) ((accum >> 24) & 0xFF);
        }
        return byteRet;
    }
    public static float[] fromBytesToFloat(byte[] Array) {
        int accum = 0;
        float[] floatRet = new float[512];
        for (int i = 0; i < Array.length; i+=4) {
            accum = Array[i + 0] & 0xFF;
            accum |= (long) (Array[i + 1] & 0xFF) << 8;
            accum |= (long) (Array[i + 2] & 0xFF) << 16;
            accum |= (long) (Array[i + 3] & 0xFF) << 24;
            floatRet[i/4] = Float.intBitsToFloat(accum);
        }
        return floatRet;
    }

然后就是将bytes数组存入数据库。我使用的Litepal定义byte数据进行存储的,当然,使用greendao或者自己写也是可以的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值