摘要: 笔者在实际工作中,有幸接触到海量的数据处理问题,对其进行处理是一项艰巨而复杂的任务。原因有以下几个方面: 一、数据量过大,数据中什么情况都可能存在。如果说有10条数据,那么大不了每条去逐一检查,人为处理,如果有上百条数据,也可以考虑,如果数据上到千万级别,甚至过亿,那不是手工能解决的了,必须通过工具或者程序进行处理,尤其海量的数据中,什么情况都可能存在,例如,数据中某处格式出了问题,尤其在程序处 理时,前面还能正常处理,突然到了某个地方问题出现了,程序终止了。 二、软硬件要求高,系统资源占用率高。对海量的数据进行处理,除了好的方法,最重要的就是合理使用工具,合理分配系统资源。一般情况... 阅读全文
posted @ 2012-09-21 19:04 aitao 阅读(386) 评论(0) 推荐(1) 编辑
摘要: 引言当您经常使用某个系统时,往往会陷入某种固定的使用模式。有时,您没有养成以尽可能最好的方式做事的习惯。有时,您的不良习惯甚至会导致出现混乱。纠正此类缺点的最佳方法之一,就是有意识地采用抵制这些坏习惯的好习惯。本文提出了 10 个值得采用的 UNIX 命令行习惯——帮助您克服许多常见使用怪癖,并在该过程中提高命令行工作效率的好习惯。下面列出了这 10 个好习惯,之后对进行了更详细的描述。在单个命令中创建目录树。更改路径;不要移动存档。将命令与控制操作符组合使用。谨慎引用变量。使用转义序列来管理较长的输入。在列表中对命令分组。在find之外使用xargs。了解何时grep应该执行计数——何时应该 阅读全文
posted @ 2012-09-21 17:23 aitao 阅读(782) 评论(0) 推荐(0) 编辑
摘要: 当然这个算不上是困难的算法,面试考的也不少,实现起来可以有多种方法,但是你能写出最优秀的吗? 大概有这几种: reverse1.新建一个单链表把原链表的内容逐个头插法插入新链表中.从而实现了链表的翻转. reverse2.新建一个数组把原链表的内容copy到数组和新链表中.从而实现了链表的翻转. reverse3.一次遍历单链表,原地将原链表翻转 评注: reverse1 在实现的时候,也只是遍历了一次原链表,但是却要新创建一个链表,来保存原链表的反转内容,相当于原链表的副本.虽然时间复杂度上为O(n),但却浪费了空间,而且还有链表的头插入,带来指针的移动额外的开支... 阅读全文
posted @ 2012-09-21 12:30 aitao 阅读(2415) 评论(0) 推荐(0) 编辑
摘要: Stevens的《unix网络编程》,由于客观原因,未能跟上Linux的新进展,尤其在linux内核日新月异的今天。本文解释下Unix的select/poll和linux下的epoll之主要区别。1. 支持一个进程打开大数目的socket描述符(FD) select最不能忍受的是一个进程所打开的FD是有一定限制的,由FD_SETSIZE设置,默认值是2048。对于那些需要支持的上万连接数目的IM服务器来说显然太少了。这时候你一是可以选择修改这个宏然后重新编译内核,不过资料也同时指出这样会带来网络效率的下降;二是可以选择多进程的解决方案(传统的Apache方案),不过虽然Linux上面创建进.. 阅读全文
posted @ 2012-09-21 10:31 aitao 阅读(3367) 评论(0) 推荐(0) 编辑
摘要: TCP/IP详解系列,关于tcp拥塞控制和数据流的地方讲的不细致,或许是涉及概念/算法太多,作者略去了一些对初学者来说比较陌生的细节吧。比如SWS未说明是什么就开始介绍其避免方法,还和nagle扯在了一起,直觉告诉我二者一定有猫腻,边搜索一下,果然很有收获。今天贴在这里,分享给大家。 关键字:糊涂窗 阅读全文
posted @ 2012-09-20 19:12 aitao 阅读(7901) 评论(2) 推荐(3) 编辑
摘要: 不是只有排序,二叉树才叫数据结构,面试栽在基本的数组和队列,链表,栈的有的是!!!本文对循环队列的重要操作作出总结。注:为了避免队列空和满两个状态混淆, 采用空闲一个位置的方式,即N个元素空间的循环队列最多只能存放N-1个有效元素。这也是大多数教材的做法。 1) 循环队列初始化:front=rear=0; 2)入队操作:rear=(rear+1)%size; 3)出队操作:front=(front+1)%size; 4)判断是否为空队列:front==rear; 5)判断队列是否已满:front=(rear+1... 阅读全文
posted @ 2012-09-20 14:06 aitao 阅读(8173) 评论(0) 推荐(1) 编辑
摘要: 当用户试图通过HTTP或FTP协议访问一台运行主机上的内容时,Web服务器返回一个表示该请求的状态的数字代码。该状态代码记录在服务器日志中,同时也可能在 Web 浏览器或 FTP客户端显示。也就是我们打开页面发生错误时浏览器显示的错误信息代码。状态代码可以指明具体请求是否已成功,还可以揭示请求失败的确切原因。HTTP协议状态码表示的意思主要分为五类,大体是:——————————————-1×× 保留2×× 表示请求成功地接收3×× 为完成请求客户需进一步细化请求4×× 客户错误5×× 服务器错误 阅读全文
posted @ 2012-09-20 10:17 aitao 阅读(630) 评论(0) 推荐(0) 编辑
摘要: register 使用修饰符register声明的变量属于寄存器存储类型(一般的都默认是存储器存储类型,volatile关键字也是针对这种类型的)。该类型与自动存储类型相似,具有自动存储时期、代码块作用域和内连接。声明为register仅仅是一个请求,因此该变量仍然可能是普通的自动变量。无论哪种情况,用register修饰的变量都无法获取地址。如果没有被初始化,它的值是未定的。volatile volatile告诉编译器该被变量除了可被程序修改外,还可能被其他代理、线程修改。因此,当使用volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,而不使用寄存器中的缓存的值。比如 阅读全文
posted @ 2012-09-18 21:25 aitao 阅读(444) 评论(0) 推荐(0) 编辑
摘要: 原文:http://coolshell.cn/articles/8275.html 在一个炎热无聊的下午,我突发奇想。我想通过电子邮件的方式对那些我非常感兴趣和非常敬重的程序员问10个问题。准备这10个问题我只花了5分钟,这些都是我个人想问他们的问题,所以,我基本上没想太多要问他们什么。最后两个问题和编程没有什么关系,我就是想问题这些人的一些兴趣爱好。另外,不是每一个人都想回答我的,这是我第一次做“访谈”,所以,我犯了一些错误,一些问题没有得到回答。不管怎么样,我得到了很多很有意思的内容,所以,这对我绝对是一次很有意义的经历。并不是每一个人都回了我的邮件,也并不是每一个人都同意回答我的这... 阅读全文
posted @ 2012-09-18 20:43 aitao 阅读(351) 评论(0) 推荐(0) 编辑
摘要: 这道题很古老了,可别将它和大端转小端混淆了,所谓大端和小端指的是字节序,而这里反转一个字节说的是位序,算法更是不胜枚举,说实话都能达到目的,剩余的就是看看谁的效率更高了,基本上这是一个最难的问题,高手不是能写出最美丽的程序而是能写出既美丽同时效率又是最高的程序,如果一个人写的程序很美丽,很直观,只能说明该程序员对语言掌握的很好,但是语言毕竟只是工具,真正做事的是计算机,只有对计算机很了解,才能写出效率最高的程序,正如文学家的文笔很多不如花季少女,但是花季少女永远也超越不了时代。不管什么样的程序,落实到底层的cpu都是那几样,尽量不要使用跳转,因为会清空流水线,相比之下,跳转的危害在x86机器上 阅读全文
posted @ 2012-09-18 20:23 aitao 阅读(4907) 评论(0) 推荐(1) 编辑
摘要: 直接操作C标准库提供的字符串操作函数是有一定风险的,稍有不慎就会导致内存问题。这周用业余时间写了一个小型的安全字符串操作库,但是测试之后才发现自己的实现有很大的性能缺陷。在Solaris上初步做了一个简单的性能比对,以下是得到的性能数据(以strlen的数据为例):当传入的字符串长度为10时,执行100w次:strlen 执行时间是:32762毫秒my_strlen执行时间是:491836毫秒当传入的字符串长度为20时,执行100w次:strlen 执行时间是:35075毫秒my_strlen执行时间是:770397毫秒很显然,标准库中strlen的消耗仅是my_strlen的十分之一不到,且 阅读全文
posted @ 2012-09-18 19:48 aitao 阅读(2605) 评论(0) 推荐(1) 编辑
摘要: 机械的《数据结构——c语言版》排序一章,有的用递归,有的算法不用递归,因而对于递归的快排,萌生非递归之想。查来资料,基本就是用堆栈(另一种常见转化方法是用while)代替,分享一下: 首先说明一下快速排序是对冒泡排序的改进。为什么这么说呢?想一下冒泡排序,它把序列分成了两部分,前半部分无序,后半部分升序排列,并且后半部分的数都大于前半部的数。由此可得到快速排序和冒泡排序的一些共同点:都要经历n趟排序每趟排序要经历O(n)次比较都是后半部分元素比前半部大而不同之处就在于冒泡排序的交换操作发生相邻的元素之间,即一趟排序可以要经过多次交换操作;快速排序的交换操作发生在间隔比较远的两个元素之间,... 阅读全文
posted @ 2012-09-14 15:49 aitao 阅读(3829) 评论(0) 推荐(0) 编辑
摘要: 去某互联网公司运维部面试,看似非常简单的一道题,我虽然五分钟内写了出来,但错误很多,还好面官只指出了一两个。更不要说运行了!最近准备求职,昨晚变拿来上机实践,结果两个多小时没挑通。晚上睡觉十二点多,还起来改了改,但仍然不完全正确,今日早饭后,又调试一小时,终于成功!拿来分享!首先,总结经验:1、动笔前一定要深思熟虑,这比边写边改实际要节约时间! 2、如果基本确认是语法错误,可以慢慢调,如果自己逻辑都不清楚,干脆重来!要有重构的勇气! 1 #include<stdio.h> 2 //程序功能,将“192.168.1.29”之类的IP转化为(相当与去掉小数点后的)整数 3 int... 阅读全文
posted @ 2012-09-13 10:29 aitao 阅读(1483) 评论(0) 推荐(0) 编辑
摘要: 一般教材都是摘一些目录做简要批注,初学者都是死记硬背,很难理解,过目就忘,所以,今天来问几个助记的问题,以期对诸君有所启发: /bin和/sbin区别? /usr/bin和/bin区别? /lib和/usr/lib区别? /usr/lib 和 /usr/include区别? /var和/usr区别? /home和/root区别? /etc作用? 搞清楚以上的问题,你基本就会全名白了。 阅读全文
posted @ 2012-09-11 16:36 aitao 阅读(487) 评论(1) 推荐(0) 编辑
摘要: RFC 793:Transmission Control ProtocolRFC 1185: 已废止,新版参见 RFC1323,TCP Extensions for High PerformanceRFC 2018:TCP Selective Acknowledgment Options (TCP选择确认相关)RFC 2581:TCP Congestion Control,Obsoleted(替换) byRFC 5681Updated byRFC 3390RFC 2616: HTTP规约1.1RFC 2019: COOKIE定义Host Requirements RFC: 主机上实现和应用各层 阅读全文
posted @ 2012-09-10 22:55 aitao 阅读(3338) 评论(0) 推荐(0) 编辑
摘要: Linux进程调度的目标 1.高效性:高效意味着在相同的时间下要完成更多的任务。调度程序会被频繁的执行,所以调度程序要尽可能的高效; 2.加强交互性能:在系统相当的负载下,也要保证系统的响应时间; 3.保证公平和避免饥渴; 4.SMP调度:调度程序必须支持多处理系统;... 阅读全文
posted @ 2012-09-04 23:34 aitao 阅读(50234) 评论(4) 推荐(9) 编辑
摘要: #include <stdio.h>int main(){int a[4]={1,2,3,4};char b[4]="5678";char *c="9999";int d[4]={5,6,7,8};//a={5,6,7,8};//不能整体赋值//a=&d;//不能整体赋值a[3]=5;b[3]='4';//c[3]='7';//gcc编译无错,运行时段错误} 阅读全文
posted @ 2012-08-25 10:17 aitao 阅读(797) 评论(0) 推荐(0) 编辑
摘要: #include <unistd.h> #include <stdio.h> int main () { char *name1;name1="111";char * name2[3];//name2={"222","222","222"};错误name2[0]="222";name2[0]=""222222;//可以改地址,但是不能改内容name2[1]="222";name2[2]="222";char (* 阅读全文
posted @ 2012-08-24 23:10 aitao 阅读(616) 评论(0) 推荐(0) 编辑
摘要: 参考:《linux命令、编辑器与shell编程》 《unix环境高级编程》 exec和source都属于bash内部命令(builtins commands),在bash下输入man exec或man source可以查看所有的内部命令信息。bash shell的命令分为两类:外部命令和内部命令。外部命令是通过系统调用或独立的程序实现的,如sed、awk等等。内部命令是由特殊的文件格式(.def)所实现,如cd、history、exec等等。 在说明exe和source的区别之前,先说明一下fork的概念。 fork是linux的系统调用,用来创建子进程(child process)... 阅读全文
posted @ 2012-07-07 17:20 aitao 阅读(64768) 评论(3) 推荐(6) 编辑
摘要: 参考《linux命令、编辑器与shell编程》(清华大学出版社) 当启动shell时,它将运行启动文件来初始化自己。具体运行哪个文件取决于该shell是登陆shell还是非登陆shell的交互方式(比如通过bash),又或者是一个非交互式shell(用来执行shell脚本)。要执行启动文件中的命令,用户就必须具备读的权限,而一般的Linux发行版本都会把对应的命令放在一些启动文件中。1:交互式登陆shell 交互式登陆shell指的是当用户登录系统时所用的那个shell(可以默认指定,如bash shell)。登录shell 将查找几个不同的启动文件来处理其中的命令, bash shel... 阅读全文
posted @ 2012-07-07 17:09 aitao 阅读(2714) 评论(0) 推荐(1) 编辑