Linux迷,Python粉
人生苦短,我用Python 新博客https://blog.pythonwood.com 问题小站https://qa.1r1g.com
posts - 40,  comments - 16,  trackbacks - 0
 
 
 
 

8月28号,接到这个问题:现有前缀查询速度较慢,改进此知值求区间问题。

一开始没想到用二分法,更没有想到这个项目用了一个月,这一个月里,我学习并使用了middle框架写出了server供别人调用。

第一阶段:

工程师tomshen同学提供了简单可行的记录分拆法:
为保证前多少位一样,在插入记录时将区段分拆以满足之,代价是记录被分拆,数据冗杂。
这种方案主要面对的是数据库处理,在实践这个方案的5天当中,每天和写sql和分析数据。
有一天周末加班到了11点办才走,询问保安得知腾讯大厦是24小时开着的。
解决方案最终已经出来了,虽然没有采用这种方案,但是在这个过程中使用了mysql,shell,awk,python,使我的这些能力有提高。

其中有个数据区间查重的要求,一开始我用python写的文本数据处理到导出后的sql数据表文件。使用局部变量时,变量总是在for循环中自主清零,使用全局变量才行,可是全局变量让脚本一下子慢了几个数量级。出来10万行的文件,使用了半个钟,试了几次实在受不了。后来在第二天,我想到awk神器,查重一般是用排序法的,排序可以交给mysql来做。于是新版的一行代码就代替了python的100行的代码,而且只要3秒即可。这让我十分惊喜,并让我印象深刻。
完成任务的方法有多种,用适合的工具完成适合的任务。
没有总是好用的语言,只有总是好用的程序员。


第二阶段:
共享内存二分法,参考CardBin源码。在这10多天里,我尝试各种ssh客户端,选择了MobaXterm这个低调而奢华的ssh客户端,尝试了各种阅读C++源码的IDE,最终舍弃codeblock,使用vi党专用的qtcreator,填补了我一直没有看源码的ide的空白,不过其对中文输入的支持烂的得实在让人发指。
后面我的效率得到极大提升,感谢这两个工具的作者和公司。


第三阶段:
解剖并模仿CardBin源码,学习unix进程间通信。CardBin项目源码有两大难点,第一是其使用的哈希分块插入算法,一直到最后我都没弄通,不过这还不算很重要。我用的是二分法而已。第二点我就绕不过了,就是对共享内存的管理。费了很大劲,在C++已经1年没进修的状态下看懂了CardBin的方法。开辟一个数据的共享内存和一个int大小的表示状态的共享内存,在使用信号量进行写的同步。我开始想模仿之,可是很疑惑怎么这么复杂,后来咨询了导师和leader,才发现不用这么负责。共享内存前写后读,只有初始化写成功后,什么信号量同步的都不需要了。

第四阶段:
听取leader的共享内存管理方法,更加简单易行,不易出错。因为托的时间久了,就不管共享内存,先进程申请堆内存替代先。这样,我用了一天办左右就写好server。后面改成共享内存用了2天多,调试1天,重构1天。总共用了5、6天时间就写好这个server了。主要是我敢于不参考已有CardBin的代码自己写了,如果还是参考Cardbin,我想我还在纠结之中。
所以,想得多不如实践得多,思考比言语走得远,行动比思考有价值。

第五阶段:
9月23日-9月30日
改进和修正服务,比如增加接口文档,设计文档。扩展接口,分析算法缺陷时,我发现了区间重叠的其中一种情况:包含重叠,会导致二分法失效。

 




总结:

1.这个项目其实是server和批跑两个工程。但是,后期注意了组件的重用,所以两个工程使用一样的comm目录,开发起来就和一个工程一样快了。
2.项目的核心文件只有cardinfo.h, cardinfo.cpp,主要实现了内存更新,二分法查找区间结构。一开始使用C++类封装操作,但是当发现需要重用时,我改成了函数,后来发现这样确实是更好的。
3.server工程的框架我用了2个星期才明明白白,原因是一开始没有好用IDE看源码,直到找到qtcreator;另一方面CardBin的参考代码复杂,负责的共享内存管理代码阻碍了我对框架代码的熟悉。
4.server实现的关键就是写一个服务类,我实现的这个类在成员函数中调用cardinfo.cpp的函数。
5.批跑有main函数,核心代码是从server拿过来的,增删些特定文件,和makefile就可以了。
6.这次项目下来,我发现了mobaxterm和qtcreator两个适合我的工具,很不容易。
7.C++的能力有了比较大的提升,我看《accelerated c++》的前十章已经可以只读代码,不看书,而且发现了两处排版错。
8.熟悉了很多周边知识,提升了python,mysql,shell,awk,sed的能力。
9.二分法确实是很快而且可靠的,连续内存二分法,不连续也可以用平行二叉数。
10.共享内存管理不需要很复杂,尤其是这个项目只要内存初始化后读操作不用同步操作,cardbin代码则复杂在这里,很感谢leader告诉我这个方法。
11.学习了svn代码托管。git已经熟练了,svn还好没太难理解。
12.每天记录一些东西,坚持下来了。
 







 
 
posted on 2014-09-26 15:04 月冷风和霜 阅读(...) 评论(...) 编辑 收藏