各个数据库存二进制大文件性能测试

news2024/11/15 15:38:10

1前言

​ 有个项目软件前端将二进制大文件存在了indexDB,每次给后端传文件(需要传到底层C++进行调用)都会导致内存占用飙升,想着使用前后端都能共同操作的数据库来解决这个内存占用的问题,并且希望这个更具尽可能的轻量,可以嵌入到程序中是最好的,通过一个安装包进行安装。

2各个数据库的性能比较

2.1 MySQL

​ 预先准备35MB的Byte数组数据,将其存到数据库的格式为blob,测试MySQL存储100块35MB的数据需要300秒,平均一块需要3s时间。

2.2 MongoDB

​ MongoDB的数据是采用键值对的形式进行存储,一样是采用100块35MB的数据进行写入,测试需要45s时间,平均一块是450ms。

2.3 SQLite测试及优化过程

2.3.1 概述

​ SQLite使用Mybatis作为ORM框架进行100块35MB的写入速度,100块使用了12s,平均一块35MB写入速度是120ms,远快于前面两种使用Mybatis读数据库blob格式出现不支持的问题,将ORM换到JdbcTemplate后,支持blob格式,进行读,一块35MB读了40s时间,猜测是JdbcTemplate是比较落后的方案,没有针对大文件优化。

2.3.2 优化流程

(一)表结构优化

​ 主键id改为PrimaryKey,并且设置自增,使得每次都可以B+树主键索引命中查询内容。

(二)Mybatis优化

依然是换回springboot最主流的mybatis框架,手写mapper.xml文件处理blob格式,指定handler处理器编写对blob的处理,最终实现对blob的读取。优化后,对读取的数据不进行解析的话,平均一块35MB的数据读取50ms,涉及到数据解析(需要用byte数组接blob,并对整个数组中的数据解析取值)会再多一些时间。

(三)使用JPA

​ Mybatis除了对blob数据读取支持不好外,操作sqlite数据库时,使用自增id无法正常生成id的值,决定换到JPA进行尝试。

在JPA下,写100块35MB的数据如下:

image-20231013170138580

​ 可见写入速度接近于Mybatis和JdbcTemplate,都是100+ms。

​ 测试读100块35MB的数据:

image-20231013170151705

​ 读的速度得到很大提升,30ms左右,快于mybatis下的50ms。

​ 在测试35块100MB大小的数据的写操作:

image-20231013170157560

​ 写操作的时间基本成线性增长,100MB一块写入需要400ms+。

​ 再测试读操作:

image-20231013170203574

100MB的读操作性能还是很高,读一块100MB大小的分块是100+ms。(上述测试涉及到的读操作都是没有对数据进行解析的)

(四)针对写过程进行优化

​ 当前场景下,需要不断对数据库执行多个插入操作,默认情况下,每次插入一个数据都会开始事务和提交事务,多次提交会重复这个流程,磁盘I/O频率高,尝试开启事务,在数据都准备好情况下再进行提交事务。在插入的方法上加入注解@Transactional,下面测试有无@Transactional情况下存10个100MB数据的情况。

image-20231013170219657

左边是使用了注解后的结果,右边是没有,开启事务后提升是很明显的。一块100MB的分块写入从400ms降低到300ms,但会导致另外一个问题,如果35个100MB的数据同时存进去会出现java堆溢出,因为这3.5g在事务commit前都是放在内存里面导致溢出。

image-20231013170226291

(五)针对读过程尝试进行优化

​ 对读过程尝试调节了SQLite一些参数,但是基本没有提升。

设置PRAGMA synchronous = OFF,关闭写同步,PRAGMA synchronous = OFF,在 sqlite3 中 synchronous 有三种模式,分别是 FULL,NORMAL 和 OFF,在系统意外终止的时候,安全性逐级减弱,FULL模式下,保证数据不会损坏,安全性最高,写入速度也最慢。

设置PRAGMA page_size = 8192,通过设置PAGE_SIZE参数,调整最小存储单元PAGE的大小,由于存入的数据较大,尝试改成8192,甚至16384。

设置完没有提升,猜测上面参数是针对数量条数很大的情况才有提升,当前情况是数据条数不多,但单独的每条数据占用内存大。

2.4 LevelDB

​ Leveldb也是轻量级数据库,属于NOSQL,是以key-value形式进行存储,Java和node.js都能同时使用,但是经过测试,同样存入35个100MB分块大小的数据,每一块存入时间是400ms,每一块读取时间也接近400ms,相比较jpa下的sqlite表现,并没有提升。

2.5 IndexDB(原有方案)

​ 读100MB的分块是50毫秒,读性能非常的好。

image-20231013170310993

写入100MB分块的时候,算上json转blob 以及入库的时间,大概是100-200ms,时间远短于尚未做数据处理的sqlite(事务下300-400ms)。

image-20231013170326346

3 结论

上述所测试的数据库性能都不如原有方案下的indexDB,最接近indexDB的sqlite,读写性能数据比较如下:

100MB分块的写入,包括json数据解析,indexDB是100-200ms,sqlite不包括数据解析在开启事务的情况下是300-400ms,不开启事务则是400-500ms。

100MB分块的读取,不包括数据解析:indexDB是50ms,sqlite是100-200ms。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1303934.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

案例044:基于微信小程序的消防隐患在线举报系统

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

项目实战二——性能测试方案

这里写目录标题 一、性能测试整体流程介绍二、性能测试时机(什么时候去做?)三、测试背景(务虚:让不懂的人尽可能看懂)四、术语约定五、测试范围1、调研分析:2、测试范围: 六、性能需求分析1、业务模型预估&…

低多边形植物模型法线贴图

在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 当谈到游戏角色的3D模型风格时,有几种不同的风格&#xf…

学习-面试java基础-(集合)

String 为什么不可变? 1线程安全 2支持hash映射和缓存。因为String的hash值经常会使用到,比如作为 Map 的键,不可变的特性使得 hash 值也不会变,不需要重新计算。 3出于安全考虑。网络地址URL、文件路径path、密码通常情况下都是以…

使用JLink仿真器实现调试打印的N种方法

方法一:使用MCU的串口 这是最古老也是最简单的方法。 电脑上面插一个USB转TTL,然后与MCU的UART_RX/UART_TX/GND连接起来。PC端再打开一个串口调试助手。两边的波特率一致,就可以收到MCU发过来的打印信息了。 方法二:使用JLink仿…

低功耗模式的通用 MCU ACM32F0X0 系列,具有高整合度、高抗干扰、 高可靠性的特点

ACM32F0X0 系列是一款支持多种低功耗模式的通用 MCU。集成 12 位 1.6 Msps 高精度 ADC 以及比 较器、运放、触控按键控制器、段式 LCD 控制器,内置高性能定时器、多路 UART、LPUART、SPI、I2C 等丰富的通讯外设,内建 AES、TRNG 等信息安全模块&#xff0…

初识文件系统

文章目录 1、概述2、inode结构3、block BitMap 和 inode BitMap4、软链接和硬链接4.1 硬链接4.2 软链接 5、Linux下的文件类型的 1、概述 文件存储在硬盘上,硬盘的最小存储单位叫做“扇区”(Sector)。每个扇区储存512字节 操作系统读取硬盘…

vue3 添加编辑页使用 cron 表达式生成

示例效果图 1、添加组件 <template><div class"v3c"><ul class"v3c-tab"><li class"v3c-tab-item" :class"{ v3c-active: tabActive 1 }" click"onHandleTab(1)">秒</li><li class&qu…

智能优化算法应用:基于蝙蝠算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于蝙蝠算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于蝙蝠算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.蝙蝠算法4.实验参数设定5.算法结果6.参考文献7.MA…

【MQ】Rocketmq如何保证消息不丢失

文章目录 前言一、前言二、消息什么情况会丢失&#xff1f;三、如何保障消息不丢失&#xff1f;3.1、生产者端3.2、Broker端3.3、消费者端 四、总结 前言 一、前言 RocketMQ可以理解成一个特殊的存储系统&#xff0c;这个存储系统特殊之处数据是一般只会被使用一次&#xff0…

Mysql安装教程(zip版)

去官网下载&#xff1a; 我这有个5.7.9的版本&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1H6Qs2mP0vzBklmD_ID7VLg 提取码&#xff1a;8xnk 管理员cmd 到mysql安装目录的bin下面 1、mysqld --initialize-insecure --usermysql //初始化执行成功之后会生…

四六级高频词组3

目录 词组 参考链接 词组 101. by chance&#xff08;accidentally&#xff0c; by accident&#xff09;偶然 102. for a change换换环境&#xff08;花样等&#xff09; 103. charge sb. with …控告某人犯有… 104. in charge of &#xff08;responsible for&#xff…

小程序商城免费搭建之b2b2c o2o 多商家入驻商城 直播带货商城 电子商务b2b2c o2o 多商家入驻商城 直播带货商城 电子商务 鸿鹄云商

1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…

音视频技术开发周刊 | 323

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 Meta牵头组建开源「AI复仇者联盟」&#xff0c;AMD等盟友800亿美元力战OpenAI英伟达 超过50家科技大厂名校和机构&#xff0c;共同成立了全新的人工智能联盟。以开源为旗号…

c++ multimap

multimap创建 multimap<string , string> m; m.insert(make_pair("12","3234")); m.insert(make_pair("12","3234")); m.insert(make_pair("12","3234"));遍历 multimap<string , string> m; m.inser…

Nacos配置管理-nacos集群搭建

一、集群结构图 其中包含3个nacos节点&#xff0c;然后一个负载均衡器代理3个Nacos。这里负载均衡器可以使用 nginx。 二、 计划实现 --计划架构-- 3个Nacos节点&#xff1b; 3个mysql库&#xff1b; --计划节点地址-- 三、集群搭建 3.1 基本步骤 &#xff08;1&#…

Camunda 7.x 系列【60】流程分类

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 2.7.9 本系列Camunda 版本 7.19.0 源码地址:https://gitee.com/pearl-organization/camunda-study-demo 文章目录 1. 前言2. 案例演示2.1 后端2.2 前端2.3 测试1. 前言 钉钉中的OA审批分类: 企业级的业务…

SQL自学通之函数 :对数据的进一步处理

目录 一、目标 二、汇总函数 COUNT SUM AVG MAX MIN VARIANCE STDDEV 三、日期/时间函数 ADD_MONTHS LAST_DAY MONTHS_BETWEEN NEW_TIME NEXT_DAY SYSDATE 四、数学函数 ABS CEIL 和FLOOR COS、 COSH 、SIN 、SINH、 TAN、 TANH EXP LN and LOG MOD POW…

软件测试之缺陷管理

一、软件缺陷的基本概念 1、软件缺陷的基本概念主要分为&#xff1a;缺陷、故障、失效这三种。 &#xff08;1&#xff09;缺陷&#xff08;defect&#xff09;&#xff1a;存在于软件之中的偏差&#xff0c;可被激活&#xff0c;以静态的形式存在于软件内部&#xff0c;相当…

输电线路故障监测系统:实现电力传输的智能化管理

随着科技的不断发展&#xff0c;电力系统的安全稳定运行对于国家经济和人民生活至关重要。为了提高电力系统的运行效率和安全性&#xff0c;恒峰智慧科技研发的输电线路故障监测系统HFP-GZS2000应运而生。本文将介绍输电线路分布式故障定位及隐患监测装置的技术原理、功能特点以…