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. nyoj 678 最小K个数之和

    最小K个数之和 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 输入n个整数,输出其中最小的K个数之和.例如输入4,5,1,1,6,2,7,3,3这9个数字,当k=4 ...

  2. javascript闭包问题

    <script type="text/javascript"> window.onload = function(){ var name = "The Win ...

  3. 关于css中z-index 的应用

    我想很多人在应用中的会碰到这个问题,设置 z-index无效:无论设置为多高的数字都没有效果: 原因是在设置z-index之前必须满足一下两个条件: 1,给设置z-index的元素设置相应的定位值,p ...

  4. WINFORM 自定义开关按钮控件-

    本文章转载:http://www.cnblogs.com/feiyangqingyun/archive/2013/06/15/3137597.html OK,大工告成,上图演示效果. 源码下载:htt ...

  5. 自己动手写缓存Version1

    实现一个最简单最主要的缓存系统. using System; using System.Data; using System.Configuration; using System.Web; usin ...

  6. Android史上功能最全的日历控件

    ※效果 ※用法 package com.fancyy.calendarweight; import java.util.ArrayList; import java.util.List; import ...

  7. linux上gcc

    查看gcc版本号 rpm -qa | grep gcc gnu的gcc是linux/unix下开发的,不能直接在window下运行.window下有gcc的移植版本.就是楼上说的MinGW和cygwi ...

  8. [转]VS2010 (C#)winform程序打包发布图解

    1.新建一个Windows窗体应用程序,例如项目名为monitor,功能略.新建的时候不要忘了创建解决方案. 2.在monitor解决方案上“右击”—— “添加”——“新建项目”,选择“其他类型项目” ...

  9. beaglebone-black 在Angstrom系统中的网络配置方法

    Beaglebone Linux 101: Assigning a Static IP Address with Connman Posted on February 6, 2012 by dwatt ...

  10. javascript笔记09:javascript的下拉式导航菜单

    <!DOCTYPE html> <html> <body> <script> function hideAll() { for(i=0;i<odi ...