携程做网站的流程,苗木网站怎么做,郑州app开发外包,做网站需要考虑哪些问题https://www.xin3721.com/eschool/pythonxin3721/本文介绍的是以为中国的IT资深人士写的一个简单的数据库#xff0c;没有我们使用的数据库那么强大#xff0c;但是值得大家借鉴。可以用在特定环境中#xff0c;更加灵活方便。数据库的名字叫WawaDB#xff0c;是用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.62小时 120万 225 2.71小时 60万 96 1.330分钟 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)3a[3]30bisect.bisect_left(a, 43)5a[5]50所以我们要往前倒一些从20(30的前一个刻度)开始读取日志21222324读取后因为比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多行的数据库代码