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. spring tranaction 事务入门

    一.事务四个属性 原子性(atomicity).一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做. 一致性(consistency).事务必须是使数据库从一个一致性状态变到另一 ...

  2. Android UI开发第三十三篇——Navigation Drawer For Android API 7

    Creating a Navigation Drawer中使用的Navigation Drawer的android:minSdkVersion="14",现在Android API ...

  3. [Angular 2] Handle Reactive Async opreations in Service

    When you use ngrx/store and you want to fire a service request. When it sucessfully return the respo ...

  4. schedule() 和 scheduleAtFixedRate() 的区别--转载

    1.  schedule() ,2个参数方法:在执行任务时,如果指定的计划执行时间scheduledExecutionTime <= systemCurrentTime,则task会被立即执行. ...

  5. JS中checkbox组件的使用

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  6. Spring安全资料整理列表

    Spring 被爆漏洞,允许远程执行代码http://automationqa.com/forum.php?mod=viewthread&tid=2827&fromuid=21 Spr ...

  7. [Form Builer]Locking Mode and LOCK_RECORD

    Locking Mode Property Description Specifies when Oracle Forms tries to obtain database locks on rows ...

  8. 从键盘输入当月利润I,求应发放奖金总数?

    企业发放的奖金根据利润提成.利润(I)低于或等于10万元时,奖金可提10%:利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%:20万到40万之间时 ...

  9. git设计哲学

    刚开始使用git的时候,总想拿git来和cvs或者svn来作对比,但不久后发现这个想法本身就是错的,git完全就是另外一种物种,一种本属于未来的物种.它的对象存储方式,快照,分支等,都是完全不同的. ...

  10. ffmpeg之YUYV转RGB ARM使用流程分析

    本例基于3.2.2 ffmpeg 一.应用调用API 二.头文件包含的API接口 对应于libswscale.so.libswscale.so.4.libswscale.so.4.2.100中 sws ...