amobbs.com 阿莫电子技术论坛

标题: 【开源】EasyFlash 发布 V5.0.0 beta,时序数据库功能来袭 …… [打印本页]

作者: sunnydragon    时间: 2020-5-5 23:48
标题: 【开源】EasyFlash 发布 V5.0.0 beta,时序数据库功能来袭 ……
本帖最后由 sunnydragon 于 2020-6-7 18:29 编辑

注意EasyFlash V5.0 新版本先已更名为 FlashDB ,欢迎大家继续关注,详见 https://www.amobbs.com/thread-5734466-1-1.html


从去年发布 V4.0 后,陆陆续续收到了大家的很多反馈。虽然 V4 开始资源占用变得更低了,但是性能经常听到大家吐槽。
大家动不动就是好几万条的数据要存储,查询时间
需要做到秒级以内。解决这个问题,恐怕动动小手术是不行的。
这个五一在家有时间,又对 EasyFlash 进行了重构,并且重新定位了 EasyFlash 的目标,未来将会聚焦于嵌入式超轻量级数据库解决方案

这次重构,主要改动了两大方面
  • 首先增加了多实例模式,这个对于提升性能会有很大的帮助,1万条 KV 的数据库,如果觉得速度慢,可以根据类别进行细分,分别存储到不同子数据库中。子数据库根据细分的比例,理论上比原有的会小 N 倍
  • 其次,增加了时序数据库功能。这个对于存储产品运行记录会非常有帮助,存储的数据量大,并且具有很高的插入及查询速度。

这次更新改动巨大,不仅是功能,还有产品定位。所以更多内容,请看 EasyFlash 最新的说明文档吧。
Github: https://github.com/armink/EasyFlash
该版本为 beta 测试版本,可能还有细节待改进,期待大家试用反馈哈~~~~


简介
EasyFlash 是一款超轻量级的嵌入式数据库开源项目,专注于提供嵌入式产品的数据存储方案。其拥有较强的可靠性及性能,并在保证极低的资源占用前提下,尽可能延长 Flash 使用寿命。
EasyFlash 提供两种数据库模式:
使用场景
如今,物联网产品种类越来越多,运行时产生的数据种类及总量及也在不断变大。EasyFlash 提供了多样化的数据存储方案,不仅资源占用小,并且存储容量大,非常适合用于物联网产品。下面是主要应用场景:

主要特性性能及资源占用统计
TSDB 性能测试1 (nor flash W25Q64)
  1. msh />tsl bench
  2. Append 1250 TSL in 5 seconds, average: 250.00 tsl/S, 4.00 ms/per
  3. Query total spent 2248 (ms) for 1251 TSL, min 1, max 2, average: 1.80 ms/per</font>
复制代码
插入平均:4 ms,查询平均:1.8 ms


TSDB 性能测试2 (stm32f2 onchip flash)
  1. msh />tsl bench
  2. Append 13527 TSL in 5 seconds, average: 2705.40 tsl/S, 0.37 ms/per
  3. Query total spent 1621 (ms) for 13528 TSL, min 0, max 1, average: 0.12 ms/per</font>
复制代码
插入平均:0.37 ms,查询平均:0.12 ms


资源占用 (stm32f4 IAR8.20)
  1.    Module                  ro code  ro data  rw data
  2.     ------                  -------  -------  -------
  3.     easyflash.o                 276      232        1
  4.     ef_kv.o                   4 584      356        1
  5.     ef_ts_log.o               1 160      236
  6.     ef_utils.o                  418    1 024
复制代码
上面是 IAR 的 map 文件信息,可见 EasyFlash 的资源占用非常低

如何使用
从 EasyFlash V5.0 开始,由于软件架构完全重构,导致代码改动巨大,为此牺牲了之前 API 的兼容性。后续 EasyFlash 的 V4.X 版本将会继续维护(见 stable-v4.x 分支),希望大家谅解。

移植
EasyFlash 底层依赖于 RT-Thread 的 FAL (Flash Abstraction Layer) Flash 抽象层开源软件包 ,该开源库也支持运行在裸机平台 (点击查看介绍)。所以只需要将所用到的 Flash 对接到 FAL ,即可完成整个移植工作。
FAL 移植主要流程:
示例
EasyFlash 提供了主要功能的示例,直接加入工程即可运行,并具有一定的参考性
文件路径介绍备注
samples/kvdb_type_string_sample.cKVDB 使用字符型键值的示例
samples/kvdb_type_blob_sample.cKVDB 使用 blob 型(任意类型)键值的示例
samples/tsdb_sample.cTSDB 示例

本坛下载:
[attach]512505[/attach]
最新版本 GitHub 下载 :https://github.com/armink/EasyFlash









作者: sunrosewang    时间: 2020-5-6 00:32
火前先留名,沙发是我的。
作者: yanyanyan168    时间: 2020-5-6 00:41
火贴板凳,一直在跟随,多谢大神
作者: xiaoergao    时间: 2020-5-6 00:47
这个要支持,这是要成为小资源的“SQLite”啊。
作者: wx-ta    时间: 2020-5-6 00:53
好东西。理解楼主的开发路线,有个小建议,5.x和4.x没有必要都叫做eazy flash,因为api差异大,服务提供也不同,干脆另外取个名字,两个作品同时维护,不同侧重点
作者: Puppey    时间: 2020-5-6 03:54
支持楼上
作者: my_avr    时间: 2020-5-6 06:12
支持楼主
作者: 闲鱼翻身    时间: 2020-5-6 06:23
火钳刘明!
作者: 血刃修罗    时间: 2020-5-6 06:56
感谢楼主分享
作者: interstellar_tr    时间: 2020-5-6 07:16
楼主辛苦!
还没看代码
找个是裸机 还是 要有操作系统啊
作者: szyusong@163    时间: 2020-5-6 07:32
感谢分享!
作者: xad74    时间: 2020-5-6 07:57
留个脚印
作者: tarchen    时间: 2020-5-6 08:05
多谢大神
作者: amxx    时间: 2020-5-6 08:13
这个厉害了,EASYFLASH早就听说大名了。啥时候也用到项目里。
作者: liwei_jlu    时间: 2020-5-6 08:24
终于等到你
作者: memory4597    时间: 2020-5-6 08:26
强烈支持,感谢
作者: leijiayou    时间: 2020-5-6 08:29
感谢分享
作者: air2016    时间: 2020-5-6 08:34
感谢分享

作者: nic_911    时间: 2020-5-6 08:35
楼主辛苦啊,强烈支持~~
作者: zhongsandaoren    时间: 2020-5-6 08:38
厉害厉害
作者: Mrp_Young    时间: 2020-5-6 08:39
终于把循环写数据这个问题解决了
作者: Flyback    时间: 2020-5-6 08:57
几年前就用过老的版本,看来是时候尝试下新版了
作者: heimareed    时间: 2020-5-6 09:05
随后跟进测试,多谢开源…
作者: leifeng    时间: 2020-5-6 09:13
Mark!Easy Flash感谢楼主分享
作者: hyghyg1234    时间: 2020-5-6 09:27
一直在用,感谢大神。
作者: 陈正杰    时间: 2020-5-6 10:22
谢谢分享

作者: yat    时间: 2020-5-6 10:35
感谢分享  
mark   EasyFlash 发布 V5.0.0 beta  键值数据库和时序数据库
作者: jiaxinhui    时间: 2020-5-6 10:38

感谢楼主分享,辛苦了!                                               
作者: lindabell    时间: 2020-5-6 10:44
刚开始用
作者: tiger_wu    时间: 2020-5-6 10:47
楼主辛苦!感谢!
作者: 我是一个大白菜    时间: 2020-5-6 10:50
用过4.0感觉还是很方便的,感谢楼主分享
作者: fsmcu    时间: 2020-5-6 10:59
感谢楼主开源,一直在用4.0版本
作者: apple_eat    时间: 2020-5-6 11:09
Berkeley DB(BDB)是一个高效的嵌入式数据库和键-值数据库编程库,C语言、C++、Java、Perl、Python、Tcl以及其他很多语言都有其对应的API。Berkeley DB可以保存任意类型的键/值对(Key/Value Pair),而且可以为一个键保存多个数据。Berkeley DB支持让数千的并发线程同时操作数据库,支持最大256TB的数据,广泛用于各种操作系统,其中包括大多数类Unix操作系统、Windows操作系统以及实时操作系统。
berkeley db
作者: foxpro2005    时间: 2020-5-6 11:12
感谢分享,后面有时间再试试新版

作者: fenglove    时间: 2020-5-6 11:40
感谢楼主开源,

作者: 网络孤客    时间: 2020-5-6 11:50
wx-ta 发表于 2020-5-6 00:53
好东西。理解楼主的开发路线,有个小建议,5.x和4.x没有必要都叫做eazy flash,因为api差异大,服务提供也 ...

同意。
作者: huchunlei    时间: 2020-5-6 12:02
支持楼主, 之前想过移植SQLITE3,后来发现硬件资源不够用,也没那么多精力,就放弃了。
作者: myrgb    时间: 2020-5-6 12:02
虽然不知道怎么用,还是要谢谢分享。先收藏
作者: powerk6    时间: 2020-5-6 12:21
支持楼主
作者: sunnydragon    时间: 2020-5-6 15:21
wx-ta 发表于 2020-5-6 00:53
好东西。理解楼主的开发路线,有个小建议,5.x和4.x没有必要都叫做eazy flash,因为api差异大,服务提供也 ...

感谢你的建议哈,之前确实也考虑过这个问题,但苦于想不好名字

现在正式版还没发布,大家也可以帮忙想个新名字哈
作者: sunnydragon    时间: 2020-5-6 15:22
xiaoergao 发表于 2020-5-6 00:47
这个要支持,这是要成为小资源的“SQLite”啊。

SQlite 是关系型数据库,体积会稍大,EasyFlash 比它要非常的轻量级
作者: sunnydragon    时间: 2020-5-6 15:23
interstellar_tr 发表于 2020-5-6 07:16
楼主辛苦!
还没看代码
找个是裸机 还是 要有操作系统啊

裸机和操作系统都行的,没有限制
作者: sunnydragon    时间: 2020-5-6 15:24
amxx 发表于 2020-5-6 08:13
这个厉害了,EASYFLASH早就听说大名了。啥时候也用到项目里。

哈哈~~不一定现在就用在项目上,可以先试试哈
作者: sunnydragon    时间: 2020-5-6 15:25
网络孤客 发表于 2020-5-6 11:50
同意。

也帮忙想个新名字哈
作者: sunnydragon    时间: 2020-5-6 15:26
huchunlei 发表于 2020-5-6 12:02
支持楼主, 之前想过移植SQLITE3,后来发现硬件资源不够用,也没那么多精力,就放弃了。 ...

EasyFlash 资源占用不到 10K ROM ,绝对小巧,下次可以试试哈
作者: zwjiang8212    时间: 2020-5-6 15:39
感谢楼主分享

作者: Momo    时间: 2020-5-6 15:57
可考虑EasyDB
作者: jerry840922    时间: 2020-5-6 16:14
4.0已经用在项目上了,小批量出货,参数保存读取非常好用,保存记录数据也非常好用,感谢楼主
作者: sunnydragon    时间: 2020-5-6 17:05
Momo 发表于 2020-5-6 15:57
可考虑EasyDB

+1 跟我开始的想法一样   
作者: wx-ta    时间: 2020-5-6 17:26
sunnydragon 发表于 2020-5-6 15:21
感谢你的建议哈,之前确实也考虑过这个问题,但苦于想不好名字

现在正式版还没发布,大家也可以帮忙想个 ...

嗯,分成两个产品之后,就不用纠结各种问题了,Goahead就维护了两个产品吧,后来那个叫做WebAPP;还有RTT和后来的RTT nano;保持命名规则统一的话可以叫做EazyDB,见名知意的话也一叫做FlashDB,哈哈
作者: liuqian    时间: 2020-5-6 19:21
时序数据库这个太好了,我之前存这些数据,是自己写的,写待比较差劲,就不拿出来献丑,有空研究下lz这个,然后把我的工程移植过去
作者: jianbo513    时间: 2020-5-6 19:43
EasyFlashDB
作者: tear604922959    时间: 2020-5-6 19:45
其实在v4版本里面,我至今还是不清楚这数据怎么存进去,到现在还是蒙的
作者: pxclihai    时间: 2020-5-6 20:18
非常感谢,项目中很有用处
作者: nyszx    时间: 2020-5-6 21:56
火前留名
作者: aohu_2012    时间: 2020-5-6 22:01
感谢楼主分享
作者: jbpan852    时间: 2020-5-6 22:11

支持楼主
作者: 823032003    时间: 2020-5-6 22:46
支持楼主,谢谢分享
作者: syj0925    时间: 2020-5-6 23:37
支持楼主,请问KV值大小这个版本有限制吗?
作者: 小溪    时间: 2020-5-7 02:21
关注留存并支持!
作者: hailing    时间: 2020-5-7 02:32
谢谢分享。
作者: mypear    时间: 2020-5-7 08:17
有裸机支持吗
作者: sunnydragon    时间: 2020-5-7 09:14
syj0925 发表于 2020-5-6 23:37
支持楼主,请问KV值大小这个版本有限制吗?

限制不大了,用户可以设置通过 API 设置 sector size,后面也会出个 sample 专门讲下 big blob 的处理
作者: sunnydragon    时间: 2020-5-7 09:14
mypear 发表于 2020-5-7 08:17
有裸机支持吗

支持的裸机
作者: sunnydragon    时间: 2020-5-7 09:15
liuqian 发表于 2020-5-6 19:21
时序数据库这个太好了,我之前存这些数据,是自己写的,写待比较差劲,就不拿出来献丑,有空研究下lz这个, ...

好呀~~期待早日用起来,分享下经验哈
作者: sunnydragon    时间: 2020-5-7 09:18
wx-ta 发表于 2020-5-6 17:26
嗯,分成两个产品之后,就不用纠结各种问题了,Goahead就维护了两个产品吧,后来那个叫做WebAPP;还有RTT ...

好的哈,等下个版本就换掉

可以先尝尝鲜,体验下新版本的功能哈
作者: Xy201207    时间: 2020-5-7 09:56
我们产品用户有需求不同用户使用的参数可以互相拷贝(不同用户的软件版本可能不同,所以参数个数也有细微的不同),现在功能实现了(很麻烦,不便维护)不是用的Cjson,不知道EasyFlash能不能做。
作者: d__xin    时间: 2020-5-7 10:19
LZ辛苦,目前正有超轻量数据记录存储、查询和标记功能的需要,真是雪中送炭啊,抽出时间来看看
作者: oooios    时间: 2020-5-7 12:01
你好有个问题请教一下。项目中使用easylog 2.1.0 和 easy flash 4.0.0;上电启动打印以下信息:
D/EasyLogger V2.1.0 is initialize success.
<info> app: Setting vector table to bootloader: 0x00078000
<info> app: Setting vector table to main app: 0x00026000
D/ENV start address is 0x0006C000, size is 8192 bytes.

D/flash erase success 1
D/after kv init
D/lock_flash_init
D/lock_settings_load
D/lock_settings_save
D/in ef_set_env_blob
D/in set_env
D/Trigger a GC check after alloc ENV failed.
D/Warning: Alloc an ENV (size 128) failed when new ENV. Now will GC then retry.
D/The remain empty sector is 1, GC threshold is 1.
D/Trigger a GC check after alloc ENV failed.
请问是哪儿出错了
以下是配置
#define EF_USING_ENV
#define EF_ENV_VER_NUM            1
#define EF_ERASE_MIN_SIZE         (4096)
#define EF_WRITE_GRAN             (32)
#define EF_START_ADDR             (EH_NV_START_ADDR + EH_NV_AREA_SIZE)//0x6a000+0x2000
#define ENV_AREA_SIZE             (0x2000)
#define LOG_AREA_SIZE             -

谢谢

作者: sunnydragon    时间: 2020-5-7 12:23
Xy201207 发表于 2020-5-7 09:56
我们产品用户有需求不同用户使用的参数可以互相拷贝(不同用户的软件版本可能不同,所以参数个数也有细微的 ...

可以支持的哦,可以用多个 KV 数据库,KV 数据库本身还支持增量升级
作者: sunnydragon    时间: 2020-5-7 12:24
d__xin 发表于 2020-5-7 10:19
LZ辛苦,目前正有超轻量数据记录存储、查询和标记功能的需要,真是雪中送炭啊,抽出时间来看看 ...

那一定要试试哈,其他试用的反馈
作者: sunnydragon    时间: 2020-5-7 12:24
oooios 发表于 2020-5-7 12:01
你好有个问题请教一下。项目中使用easylog 2.1.0 和 easy flash 4.0.0;上电启动打印以下信息:
D/EasyLogg ...

每次上电都是这样的吗?好像没有看到有错误,只是有 GC 的警告
作者: oooios    时间: 2020-5-7 12:52
不是,每次全片擦除后会有。
作者: jia_xuan    时间: 2020-5-7 17:38
针对5.0版本,楼主能提供一个STM32的工程文件最好。可以更快上手。
作者: cooltommy    时间: 2020-5-7 17:53
请问支持SPI 接口的NAND Flash吗?
作者: ju2320601    时间: 2020-5-7 21:41
支持支持
作者: sunnydragon    时间: 2020-5-8 08:42
oooios 发表于 2020-5-7 12:52
不是,每次全片擦除后会有。

那应该是正常
作者: sunnydragon    时间: 2020-5-8 08:43
jia_xuan 发表于 2020-5-7 17:38
针对5.0版本,楼主能提供一个STM32的工程文件最好。可以更快上手。

请继续关注项目,后面会提供 demo 的
作者: oooios    时间: 2020-5-8 22:23
这两个失败和警告会有啥影响?会导致数据存储出错吗?目前数据存储是正常的,但是有失败和警告存在心里还是有点慌!
作者: dy22511825    时间: 2020-5-9 09:50
....刚用上4.1小批量,这是不是得换5,0?  还有能否支持 铁电存储
作者: jia_xuan    时间: 2020-5-13 10:02
我用的是STM32L431,
宏定义配置如下:
/* the flash write granularity, unit: bit
* only support 1(nor flash)/ 8(stm32f4)/ 32(stm32f1)/ 64(stm32l4) */
#define EF_WRITE_GRAN    8/* @note you must define it for a value */
写函数如下:
EfErrCode ef_port_write(uint32_t addr, const uint32_t *buf, size_t size) {
   
        EfErrCode result = EF_NO_ERR;
        EF_ASSERT(size % 4 == 0);
    /* You can add your code under here. */

        HAL_StatusTypeDef FlashStatus=HAL_OK;
        u32 i;
        __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_ALL_ERRORS);
   
        HAL_FLASH_Unlock();             //解锁       
        if(FlashStatus==HAL_OK)
        {
                for(i=0;i<size;i++)
                {
                        if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD,addr, *buf)!=HAL_OK)//写入数据
                        {
                                return 1;        //写入异常
                        }
                        addr +=8;
                        buf++;
                }  
        }
        HAL_FLASH_Lock();//上锁         
            return result;
}

问题:
ef_port_write()函数定义数据 uint32_t *buf,HAL_FLASH_Program()函数定义uint64_t *buf,这个地方数据如何转换,一直调试不通。
作者: lhaoyue    时间: 2020-5-18 21:09
jia_xuan 发表于 2020-5-13 10:02
我用的是STM32L431,
宏定义配置如下:
/* the flash write granularity, unit: bit

HAL_FLASH_Unlock();

  __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPERR);
       
       
        for (i = 0; i < size;buf++,i += 4,addr += 4) {
                        /* write data */
                        if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr, (uint64_t)*buf) == HAL_OK){
                                //printf("address: 0x%X size: %d data: 0x%X",addr,size,*buf);
                        }else{
                                printf("Flash program error: %d! \r\n",HAL_FLASH_GetError());
                        }
                        read_data = *(uint32_t *)addr;
                        /* check data */
                        if (read_data != *buf) {
                                        result = EF_WRITE_ERR;
                                        break;
                        }
    }
        /* Lock the Flash to disable the flash control register access */
        HAL_FLASH_Lock();

  return result;
作者: lhaoyue    时间: 2020-5-18 21:09
jia_xuan 发表于 2020-5-13 10:02
我用的是STM32L431,
宏定义配置如下:
/* the flash write granularity, unit: bit


试试这个看行不行
作者: jia_xuan    时间: 2020-5-19 14:13
lhaoyue 发表于 2020-5-18 21:09
HAL_FLASH_Unlock();

  __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | ...

看到移植说明这样说的:


在移植时务必先要了解项目的Flash规格,这里需要了解是规格是 擦除粒度(擦除最小单元) 、写入粒度及 内部存储结构 ,各个厂家的Flash规格都有差异,同一厂家不同系列的规格也有差异。以下是一些常见 Flash 的规格

Flash 类型        写入粒度        擦除粒度        内部存储结构
STM32F1 片内 Flash        4bytes        1K/2K        均匀分布
STM32F2/F4 片内 Flash        1byte        16K/64K/128K        最大的有128K,最小的有16K
Nor Flash(SPI-Flash)        1bit        4K        均匀分布
注意 :

1、务必保证熟悉Flash规格后,再继续下章节;
2、V4.0 新模式暂时无法使用在 STM32L4 片内 Flash 上,L4 只能使用 V3.0 版本或者 V4.0 的 EF_ENV_USING_LEGACY_MODE 模式



我试了,也没成功,暂时先放一放,等有时间了再试。也谢谢你。
作者: bule    时间: 2020-6-7 12:20
谢谢大神分享~
作者: armok.    时间: 2020-6-7 12:34
sunnydragon 发表于 2020-5-8 08:43
请继续关注项目,后面会提供 demo 的


我一会帮你开一个分论坛“EasyFlash” 专栏(分论坛)吧。

帮你将之前的帖子汇总到该分论坛,跟方便交流。

开源到何种程度由你决定。版权和发行成品套件的利润全归你。
作者: ysu_er    时间: 2020-6-10 18:57
讲讲移植的方法撒
作者: sunnydragon    时间: 2020-6-11 11:39
ysu_er 发表于 2020-6-10 18:57
讲讲移植的方法撒

看下这里的介绍 https://www.amobbs.com/forum.php?mod=viewthread&tid=5734466
作者: motata2006    时间: 2020-6-13 10:01
这个一定用一下,sqlite对我的项目还是有点大。
作者: sheneg    时间: 2020-6-13 21:03
看着挺不错,以后试着用在项目中!
作者: raywongm78    时间: 2020-6-21 22:05
好东西,支持楼主
作者: citroen988    时间: 2020-6-23 18:03
有移植到linux系统中的吗?  linux文件模拟flash存储。




欢迎光临 amobbs.com 阿莫电子技术论坛 (https://www.amobbs.com/) Powered by Discuz! X3.4