python3 mysql代码行_教你用100多行写一个数据库(附源码)|python3教程|python入门|python教程...

https://www.xin3721.com/eschool/pythonxin3721/

本文介绍的是以为中国的IT资深人士写的一个简单的数据库,没有我们使用的数据库那么强大,但是值得大家借鉴。可以用在特定环境中,更加灵活方便。

数据库的名字叫WawaDB,是用python实现的。由此可见python是灰常强大啊!

简介

记录日志的需求一般是这样的:

只追加,不修改,写入按时间顺序写入;

大量写,少量读,查询一般查询一个时间段的数据;

MongoDB的固定集合很好的满足了这个需求,但是MongoDB占内存比较大,有点儿火穿蚊子,小题大做的感觉。

WawaDB的思路是每写入1000条日志,在一个索引文件里记录下当前的时间和日志文件的偏移量。

然后按时间询日志时,先把索引加载到内存中,用二分法查出时间点的偏移量,再打开日志文件seek到指定位置,这样就能很快定位用户需要的数据并读取,而不需要遍历整个日志文件。

性能

Core 2 P8400,2.26GHZ,2G内存,32 bit win7

写入测试:

模拟1分钟写入10000条数据,共写入5个小时的数据, 插入300万条数据,每条数据54个字符,用时2分51秒

读取测试:读取指定时间段内包含某个子串的日志

数据范围 遍历数据量 结果数 用时(秒)

5小时 300万 604 6.6

2小时 120万 225 2.7

1小时 60万 96 1.3

30分钟 30万 44 0.6

索引

只对日志记录的时间做索引, 简介里大概说了下索引的实现,二分查找肯定没B Tree效率高,但一般情况下也差不了一个数量级,而且实现特别简单。

因为是稀疏索引,并不是每条日志都有索引记录它的偏移量,所以读取数据时要往前多读一些数据,防止漏读,等读到真正所需的数据时再真正给用户返回数据。

如下图,比如用户要读取25到43的日志,用二分法找25,找到的是30所在的点,

索引:0         10        20        30        40        50 日志:|.........|.........|.........|.........|.........|>>>a = [0, 10, 20, 30, 40, 50]>>>bisect.bisect_left(a, 35)>>>3>>>a[3]>>>30>>>bisect.bisect_left(a, 43)>>>5>>>a[5]>>>50

所以我们要往前倒一些,从20(30的前一个刻度)开始读取日志,21,22,23,24读取后因为比25小,所以扔掉, 读到25,26,27,...后返回给用户

读取到40(50的前一个刻度)后就要判断当前数据是否大于43了,如果大于43(返回全开区间的数据),就要停止读了。

整体下来我们只操作了大文件的很少一部分就得到了用户想要的数据。

缓冲区

为了减少写入日志时大量的磁盘写,索引在append日志时,把buffer设置成了10k,系统默认应该是4k。

同理,为了提高读取日志的效率,读取的buffer也设置了10k,也需要根据你日志的大小做适当调整。

索引的读写设置成了行buffer,每满一行都要flush到磁盘上,防止读到不完整的索引行(其实实践证明,设置了行buffer,还是能读到半拉的行)。

查询

啥?要支持SQL,别闹了,100行代码怎么支持SQL呀。

现在查询是直接传入一个lambada表达式,系统遍历指定时间范围内的数据行时,满足用户的lambada条件才会返回给用户。

当然这样会多读取很多用户不需要的数据,而且每行都要进行lambda表达式的运算,不过没办法,简单就是美呀。

以前我是把一个需要查询的条件和日志时间,日志文件偏移量都记录在索引里,这样从索引里查找出符合条件的偏移量,然后每条数据都如日志文件里seek一次,read一次。这样好处只有一个,就是读取的数据量少了,但缺点有两个:

索引文件特别大,不方便加载到内存中

每次读取都要先seek,貌似缓冲区用不上,特别慢,比连续读一个段的数据,并用lambda过滤慢四五倍

写入

前面说过了,只append,不修改数据,而且每行日志最前面是时间戳。

多线程

查询数据,可以多线程同时查询,每次查询都会打开一个新的日志文件的描述符,所以并行的多个读取不会打架。

写入的话,虽然只是append操作,但不确认多线程对文件进行append操作是否安全,所以建议用一个队列,一个专用线程进行写入。

没有任何锁。

排序

默认查询出来的数据是按时间正序排列,如需其它排序,可取到内存后用python的sorted函数排序,想怎么排就怎么排。

100多行的数据库代码

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

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

相关文章

MongoDB 5.0新特性概览

简介: MongoDB 5.0标志着一个新的发布周期的到来,以更快地交付新特性给到用户。版本化API与在线重新分片相结合,使用户不必担心未来的数据库升级以及业务变化问题;本地原生时间序列数据平台也使MongoDB能支持更广泛的工作负载和业…

深入前端研发效能治理:数据化运营思路及其实践

简介: 数据中台前端研发无不让人厚重真实地感受到“唯一不变的是变化”。拿集团的数据资产服务平台来说,业务上经过两年的发展,已由单一的数据管理和使用平台发展成了集团具有一定规模和影响力的全域数据要素交易所,而从前端技术侧…

啥情况?为什么我的 Service 无法注入进来?

作者 | 敖丙来源 | 敖丙今天同事火急火燎的走了过来,说:快帮我看看这个错误,啥情况啊?我一看报错:Field xxxService in com.xx.xx.service.impl.XxXServiceImpl required a bean of type com.xx.xx.service.XxxService…

oracle sga pga mysql_oracle实例内存(SGA和PGA)调整-xin

一、名词解释(1)SGA:System Global Area是Oracle Instance的基本组成部分,在实例启动时分配;系统全局域SGA主要由三部分构成:共享池、数据缓冲区、日志缓冲区。(2)共享池:Shared Pool用于缓存最近被执行的SQL语句和最近被使用的数…

IoT Studio可视化搭建平台编辑历史功能的思考与探索

简介: 在前端可视化搭建领域中“重做”和“撤销”这两个功能已经是标配中的标配,毕竟只要有用户行为的地方就可能会有出错,这两个功能无疑就是为用户提供了“后悔药”。目前有各种各样的可视化搭建平台,本文介绍IoT Studio可视化搭…

Metasploit 实现木马生成、捆绑及免杀

简介: 在渗透测试的过程中,避免不了使用到社会工程学的方式来诱骗对方运行我们的木马或者点击我们准备好的恶意链接。木马的捆绑在社会工程学中是我们经常使用的手段,而为了躲避杀毒软件的查杀,我们又不得不对木马进行免杀处理。本…

开源数据库兴起,你需要了解的三件事

作者 | SolarWinds 首席极客 Kevin Kline 编辑 | 宋慧 出品 | CSDN云计算 技术专家每天都必须要平衡生产力与成本以及复杂性,随着开源数据库的日益普及,负责数据库平台的技术人员正面临着更大的挑战。 在最新的《SolarWinds调查报告》中,近…

python dll注入 网络_python – 检测反射型DLL注入

如何挂接VirtualProtect API。因为加载本身的DLL肯定会在其内存代码范围内执行。这是因为(如您所提到的),他们使用用户访问权限,因此他们必须使用进程用户空间API。NTSYSAPI NTSTATUS NTAPI ZwProtectVirtualMemory(IN HANDLE ProcessHandle,IN PVOID * …

怎么提高自己的系统架构水平

简介: 系统设计与架构理论这个问题,回答起来非常宽泛,基本所有的技术理论都可以涵盖。作为一个撸代码快 10 年的后端技术人员,简单发表一下我的看法。 原创 勇剑 淘系技术 7月15日 系统设计与架构,与系统的业务类型…

云计算架构设计6大原则,你遵循了吗?| 赠书

作者 | 吕昭波 2006年,第一个云计算(Cloud Computing)产品诞生,云计算的概念也被提出,现在云计算几乎已经渗入所有的行业和应用场景中。我们不一定能直接感受到云计算对日常生活、工作、学习的影响,但作为I…

python写自动化工具_微软最强 Python 自动化工具开源了!不用写一行代码!

1. 前言最近,微软开源了一款非常强大的 Python 自动化依赖库:playwright-python它支持主流的浏览器,包含:Chrome、Firefox、Safari、Microsoft Edge 等,同时支持以无头模式、有头模式运行playwright-python 提供了同步…

复杂推理模型从服务器移植到Web浏览器的理论和实战

简介: 随着机器学习的应用面越来越广,能在浏览器中跑模型推理的Javascript框架引擎也越来越多了。在项目中,前端同学可能会找到一些跑在服务端的python算法模型,很想将其直接集成到自己的代码中,以Javascript语言在浏览…

国家网络安全宣传周:勒索病毒利如刀,上网备好技能包

简介: 近年来,勒索病毒携带着日趋成熟的手段革新和愈发隐蔽、复杂的“进化”能力,开启了“重装上阵”的疯狂模式,“出镜率”大有提高。由于大型政企机构的网络资产价值高,就成了勒索病毒的头号“猎物”。 政企机构信息…

漫画:什么是“低代码”开发平台?

作者 | 小灰来源 | 程序员小灰什么是低代码?其实,这并不是最近才出现的新概念。自从计算机诞生以来,人们就一直在想方设法提升计算机程序编写的效率。从最初的机器语言,发展到现在的C、Java、Python等高级语言;从完全独…

r语言实现岭回归_数据分析中常见的七种回归分析以及R语言实现(五)

套索回归,这个回归模型有些新颖,要写个详细的介绍预计要写好长,受限于水平,就写个普及文,所以这里就稍微简答的介绍一下;为什么我们老说多重共线性呢?那是,因为我们在研究数据的时候…

OpenKruise 如何实现应用的可用性防护?

简介: OpenKruise 在 2021.9.6 发布了最新的 v0.10.0 版本新增了弹性拓扑管理和应用安全防护等能力,本文将为大家揭晓 OpenKruise 是如何实现应用的可用性防护能力。 前言 OpenKruise 是阿里云开源的云原生应用自动化管理套件,也是当前托管…

Serverless 工程实践 | Serverless 应用优化与调试秘诀

简介: 本文将以阿里云函数计算为例,提供了在线调试、本地调试等多种应用优化与调试方案。 作者|刘宇 前言:本文将以阿里云函数计算为例,提供了在线调试、本地调试等多种应用优化与调试方案。 Serverless 应用调试秘…

新一代容器平台ACK Anywhere,来了

简介: 近日,阿里云容器服务全面升级为ACK Anywhere,让企业在任何需要云的地方,都能获得一致的容器基础设施能力。 5G、AR、AIoT 等场景在推动新一代云架构的演进,而容器重塑了云的使用方式。 近日,阿里云…

高密自智,体小量大,希捷Exos Corvault存储系统为数据洞察赋能

2022年2月24日——全球领先的海量数据存储基础设施解决方案提供商希捷科技(NASDAQ:STX)在线上举办了主题为“高密自智,体小量大”的新一代PB级自修复存储系统——Exos Corvault新品鉴赏会。 此次鉴赏会邀请到了E企研究院首席研究…

mysql复杂查询sql_mysql – 复杂的SQL查询,很多很多

像这样的东西.Select people.id, people.name, count(interest.id)from peopleleft join people_interests on people.id people_interests.peopleidleft join interests on people_interests.interestid interests.interest.idwhere interests.id in (select id from intere…