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.每天记录一些东西,坚持下来了。

 
 

【实习记】2014-09-24万事达卡bin查询项目总结的更多相关文章

  1. 2016年12月29日 星期四 --出埃及记 Exodus 21:24

    2016年12月29日 星期四 --出埃及记 Exodus 21:24 eye for eye, tooth for tooth, hand for hand, foot for foot,以眼还眼, ...

  2. 12.我们不是在真空里谈软件工程, 软件要运行在硬件芯片上面, 下面看看一个计算机芯片的发展历史: http://perspectives.mvdirona.com/2014/09/august-21-2014-computer-history-museum-presentation/ http://mvdirona.com/jrh/TalksAndPapers/DileepBhandar

    电脑芯片的诞生和发展是20世纪最伟大的发明之一,芯片技术决定了计算机升级换代的速度,决定了计算机小型化实现的程度,决定了计算机智能化的程度,决定了计算机普及化的应用深度. 1971年11月15日,英特 ...

  3. 2016年12月3日 星期六 --出埃及记 Exodus 20:24

    2016年12月3日 星期六 --出埃及记 Exodus 20:24 "`Make an altar of earth for me and sacrifice on it your bur ...

  4. 2016年11月8日 星期二 --出埃及记 Exodus 19:24

    2016年11月8日 星期二 --出埃及记 Exodus 19:24 The LORD replied, "Go down and bring Aaron up with you. But ...

  5. 2016年10月13日 星期四 --出埃及记 Exodus 18:24

    2016年10月13日 星期四 --出埃及记 Exodus 18:24 Moses listened to his father-in-law and did everything he said.于 ...

  6. 2016年6月27日 星期一 --出埃及记 Exodus 14:24

    2016年6月27日 星期一 --出埃及记 Exodus 14:24 During the last watch of the night the LORD looked down from the ...

  7. 【实习记】2014-09-26恢复linux下误删的ntfs盘中的文件

        情景,ubuntu下把NTFS格式的盘中的“实习记”文件夹彻底删除了,追毁莫及,粗心觉不是一件好的事情. linux下回复ntfs盘下的文件不能用ext3grep,而使用debugfs命令实在 ...

  8. 实习记——《Rethink》

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/gmszone/article/details/30045055 最终能够在和自己的电脑上写下这些字了 ...

  9. NOIP2018赛前停课集训记(10.24~11.08)

    前言 为了不久之后的\(NOIP2018\),我们的停课从今天(\(Oct\ 24th\))起正式开始了. 本来说要下周开始的,没想到竟提早了几天,真是一个惊喜.毕竟明天有语文考试.后天有科学考试,逃 ...

随机推荐

  1. Hadoop源码的编译过程详细解读(各版本)

    说在前面的话   重新试多几次.编译过程中会出现下载某个包的时间太久,这是由于连接网站的过程中会出现假死,按ctrl+c,重新运行编译命令. 如果出现缺少了某个文件的情况,则要先清理maven(使用命 ...

  2. 如何使用iframe实现隐藏的CSRF

    1.攻击者在“页面1”中http://www.b.com/indexb.html中写下如下代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1. ...

  3. Windows平台Atom编辑器的常用快捷键小抄Cheat Sheet

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:Windows平台Atom编辑器的常用快捷键小抄Cheat Sheet.

  4. 谁才是最快的消息队列:ActiveMQ, RabbitMQ[转]

    Lately I performed a message queue benchmark, comparing several queuing frameworks (RabbitMQ, Active ...

  5. 服务框架HSF分析之一容器启动

    大家平时都在用这个服务框架.简单阅读了下代码,了解其原理可以方便解决一些常见hsf的问题.限于篇幅,整个分析将分几个系列发布.第一篇将简单介绍Hsf的启动和各组件之间关系. 一.  Hsf总体架构 这 ...

  6. VS2005配置CPPUnit进行单元測试

    一. 编译CPPUnitproject 1.  解压文件cppunit-1.12.1.tar.gz. 2.  编译$BASE/src/cppunit/CppUnitLibraries.dsw中的cpp ...

  7. 在Linux环境中使用Ext3文件系统

      Linux缺省情况下使用的文件系统为Ext2,ext2文件系统的确高效稳定.但是,随着Linux系统在关键业务中的应用,Linux文件系统的弱点也渐渐显露出来了:其中系统缺省使用的ext2文件系统 ...

  8. 原创 C# 正则表达式 读写 Ini 文件

    昨天遇到读ini文件的问题,我知道C#里没有提供相应的类,所有的.net配置都是xml方式存储的. 读取ini文件,很多人直接google一把,然后添加dll引用.介绍的比较详细的,如: C#如何读写 ...

  9. VOA学习-South Sudan Must Allow Aid

    South Sudan Must Allow Aid The United States is gravelyconcerned by the serious escalation of the hu ...

  10. 敏捷软件工程(agile software development) VS传统软件工程(traditional software development)

    敏捷软件工程(agile software development) VS传统软件工程(traditional software development)      Agile principle  ...