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. Redis学习资料汇总(荐)

    Redis学习手册系列: http://www.cnblogs.com/stephen-liu74/category/354125.html Redis详解:sorted sets数据类型及操作-IT ...

  2. 第一步 配置D2RQ环境

    ​第一步 配置D2RQ环境 Getting Started 2013年10月15日 15:16:55 老套路,还是先配置环境,没查到什么中文资料,写在这里,供大家参考.有需要交流的可以加QQ: 1q7 ...

  3. 收集磁盘分区信息(总量、可用、已用、百分比)导出到csv

    #############################脚本功能及说明##################################################该脚本用来收集磁盘分区总大小 ...

  4. jQuery获取Select选中的Text和Value,根据Value值动态添加属性

    语法解释:1. $("#select_id").change(function(){//code...}); //为Select添加事件,当选择其中一项时触发2. var chec ...

  5. 跨时钟域设计【二】——Fast to slow clock domain

    跨时钟域设计中,对快时钟域的Trigger信号同步到慢时钟域,可以采用上面的电路实现,Verilog HDL设计如下:   // Trigger signal sync, Fast clock dom ...

  6. java_method_删除事务回滚

    public String[] deleteEPGroup(String groupID, String groupName) { String[] operRes=new String[3]; if ...

  7. Android 系统常用的权限

    权限 说明 ACCESS_NETWORK_STATE 允许应用程序获取网络状态信息的权限 ACCESS_WIFI_STATE 允许应用程序获取 Wi-Fi 网络状态的权限 BATTERY_STATE ...

  8. 如何在网页上显示html代码?

    a: 把代码写在文本区域 <textarea> 标签中.可以设置 disabled="disabled" 属性,禁止用户操作.b: 把要显示在html文档中标签的 &q ...

  9. js中对象的创建

    json方式,构造函数方式,Object方式,属性的删除和对象的销毁 <html> <head> <title>js中的对象的创建</title> &l ...

  10. ASP.NET反射

    (转载至博客园 dodo-yufan) 两个现实中的例子:1.B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内脏的生理情况.这是如何做到的呢?B超是B型超声波,它可以透过肚皮通过向你体 ...