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

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

时间:2023-10-13 17:25:33浏览次数:41  
标签:二进制 数据库 100MB 测试 100 数据 35MB blob

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。

标签:二进制,数据库,100MB,测试,100,数据,35MB,blob
From: https://www.cnblogs.com/scottyzh/p/17762605.html

相关文章

  • mysql 自带的数据库下载地址
    https://dev.mysql.com/doc/index-other.html  ......
  • Sqoop不能正常导出文件到Mysql数据库的问题解决
    之前在使用sqoop输入以下命令时bin/sqoopexport\--connectjdbc:mysql://node1:3306/journal\--usernameroot\--password123456\--tabletop_courses_by_traffic\--export-dir/user/hive/warehouse/journal.db/top_courses_by_traffic--input-fields-terminated-......
  • 文心一言Plugin实战来了,测试开发旅游攻略助手
    刚刚过去的8月,百度WAVESUMMIT深度学习开发者大会上,重磅发布文心一言的五个原生插件:百度搜索、览卷文档(基于文档的交互)、E言易图(数据洞察图表生成)、说图解画(基于图片的交互)、一镜流影(文字转视频)。我们知道大模型的训练过程一般都需要比较长的时间,强如ChatGPT4用到的最新数据也只......
  • 2023.10.13测试
    \[\text{NOIP模拟赛-2023.10.13}\](牛客场)T1矩阵交换一个\(n\timesm\)的矩阵\(A\),\(A_{i,j}\in\{1,2,3\}\)。每次可以任意交换两行,问能否使每列单调不降\(T,n\leq100\)签到题,写了\(1.5\rmh\),纯唐code#include<bits/stdc++.h>#definepiipair<int,int>usingname......
  • 2023年石门中学NOIP模拟测试(2023.10.13)
    再次被打爆...T1sb题,写个\(\text{vector}\)排序还挂了,服了。T2oh,我会推柿子。oh,我不会\(\text{Lucas}\)......
  • 《最新出炉》系列初窥篇-Python+Playwright自动化测试-20-处理鼠标拖拽-下篇
    1.简介上一篇中,宏哥说的宏哥在最后提到网站的反爬虫机制,那么宏哥在自己本地做一个网页,没有那个反爬虫的机制,谷歌浏览器是不是就可以验证成功了,宏哥就想验证一下自己想法,其次有人私信宏哥说是有那种类似拼图的验证码如何处理。于是写了这一篇文章,另外也是相对前边做一个简单的总结......
  • 渗透测试高级技巧(二):对抗前端动态密钥与非对称加密防护
    在前文的技术分享中,我们描述了验签和静态对称加密(静态密钥AES)的常见场景,大家我相信遇到类似的加解密清醒,基本都可以通过热加载的基本使用获得破解前端加密解密的方法,达到一个比较好的测试状态。在本文中,我们在保持同样的通用适配度的同时,将会来接触更加复杂的前端加密与解密场......
  • 1553B总线测试仪
    1553B总线测试仪-天津光达航电科技有限公司在测试模拟1553B总线的标准化测试仪器,该仪器是通过简单直观的管理工具实现复杂的MIL-STD-1553的测试及模拟功能,主要包括对MIL-STD-1553B总线的在线仿真测试实时显示、数据分析、数据存盘、数据回放等功能,满足了设备检测和故障定位的需要,......
  • Flink测试利器之DataGen初探
    什么是FlinksqlFlinkSQL是基于ApacheCalcite的SQL解析器和优化器构建的,支持ANSISQL标准,允许使用标准的SQL语句来处理流式和批处理数据。通过FlinkSQL,可以以声明式的方式描述数据处理逻辑,而无需编写显式的代码。使用FlinkSQL,可以执行各种数据操作,如过滤、聚合、连......
  • 测试过程效率的提升和演变
    昨天看到这样一个很有意思的问题:一个月发布一个版本,核心需求经常变更,导致影响范围大不好评估,但对交付质量的要求比较高。单元测试、自动化测试才开始建设,为了保障质量只能投入大量资源做回归测试验证,但每个版本留给测试的时间又不够充足。这种尴尬的阶段,该如何保障产品质量?......