正文内容加载中...
posted @ 2013-01-27 20:30 Gwa 阅读 (285) 评论 (0) 编辑
摘要:论坛上经常有对P2P原理的讨论,但是讨论归讨论,很少有实质的东西产生(源代码)。呵呵,在这里我就用自己实现的一个源代码来说明UDP穿越 NAT的原理。首先先介绍一些基本概念:NAT(Network Address Translators),网络地址转换:网络地址转换是在IP地址日益缺乏的情况下产生的,它的主要目的就是为了能够地址重用。NAT分为两大类:* 基本的NAT,和* NAPT(Network Address/Port Translator)。最开始NAT是运行在路由器上的一个功能模块。最先提出的是基本的NAT,它的产生基于如下事实:一个私有网络(域)中的节点中只有很少的节点需要与外网连 阅读全文
posted @ 2013-01-27 20:28 Gwa 阅读 (48) 评论 (0) 编辑
摘要:海量分布式存储技术 为保证高可用、高可靠和经济性,云计算采用分布式存储的方式来存储数据和冗余存储的方式来保证存储数据的可靠性,一高可靠软件来ibuyingjian呃不可靠,从而提供廉价可靠的系统。为了满足大量用户的需求,数据存储技术必须具有高吞吐率和高传输率的特点。 云计算的数据存储系统主要有Google GFS(Google File System)和Hadoop开发团队的开源系统HDFS(Hadop Distributed File System)。大部分IT厂商,包括Yahoo、Intel的“云”计划采用的都是HDFS的数据存储技术。 并行编程模式 为了高效地利用云计算的资源,使... 阅读全文
posted @ 2012-11-21 09:27 Gwa 阅读 (62) 评论 (0) 编辑
摘要:本文将介绍三种动态hash方法。散列是一个非常有用的、非常基础的数据结构,在数据的查找方面尤其重要,应用的非常广泛。然而,任何事物都有两面性,散列也存在缺点,即数据的局部集中性会使散列的性能急剧下降,且越集中,性能越低。数据集中,即搜索键在通过hash函数运算后,得到同一个结果,指向同一个桶,这时便产生了数据冲突。通常解决数据冲突的方法有:拉链法(open hashing)和开地址法(open addressing)。拉链法我们用的非常多,即存在冲突时,简单的将元素链在当前桶的最后元素的尾部。开放地址法有线性探测再散列、二次线性探测再散列、再hash等方法。以上介绍的解决冲突的方法,存在一个前 阅读全文
posted @ 2012-04-05 00:19 Gwa 阅读 (3703) 评论 (0) 编辑
摘要:原文:http://blog.sina.com.cn/s/blog_6d677b680100ti46.html程序员们经常编写内存管理程序,往往提心吊胆。如果不想触雷,唯一的解决办法就是发现所有潜伏的地雷并且排除它们,躲是躲不了的。本文的内容比一般教科书的要深入得多,读者需细心阅读,做到真正地通晓内存管理。 1、内存分配方式 内存分配方式有三种: (1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。 (2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。... 阅读全文
posted @ 2012-04-03 19:00 Gwa 阅读 (39) 评论 (0) 编辑
摘要:原文:最近的机器内存又爆满了,除了新增机器内存外,还应该好好review一下我们的代码,有很多代码编写过于随意化,这些不好的习惯或对程序语言的不了解是应该好好打压打压了。 下面是参考网络资源总结的一些在Java编程中尽可能要做到的一些地方。 1. 尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面: 第一,控制资源的使用,通过线程同步来控制资源的并发访问; 第二,控制实例的产生,以达到节约资源的目的; 第三,控制数据共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信。 2. 阅读全文
posted @ 2012-04-03 12:49 Gwa 阅读 (25) 评论 (0) 编辑
摘要:hash:桶式散列是典型例子。动态哈希见http://www.cnblogs.com/kegeyang/archive/2012/04/05/2432608.html线性索引:经常用于按primary key给记录排序,一般是索引排序,记录不动,索引链到记录。。倒排索引:(1)基于属性的倒排。用来索引文件中的数据记录(2)基于正文的倒排,用于检索文档。静态索引:多分树。包括数据区和索引区。数据插入删除不方便,数据区满了的时候要开溢出区链过去。动态索引:B树,B+树…… 阅读全文
posted @ 2012-04-03 12:40 Gwa 阅读 (92) 评论 (0) 编辑
摘要:哨兵的作用 算法中引进的附加记录R[0]称监视哨或哨兵(Sentinel)。 哨兵有两个作用: ① 进人查找(插入位置)循环之前,它保存了R[i]的副本,使不致于因记录后移而丢失R[i]的内容; ② 它的主要作用是:在查找循环中"监视"下标变量j是否越界。一旦越界(即j=0),因为R[0].key和自己比较,循环判定条件不成立使得查找循环结束,从而避免了在该循环内的每一次均要检测j是否越界(即省略了循环判定条件"j>=1")。注意: ① 实际上,一切为简化边界条件而引入的附加结点(元素)均可称为哨兵。 【例】单链表中的头结点实际上是一个哨兵 ② 引 阅读全文
posted @ 2012-04-02 13:28 Gwa 阅读 (296) 评论 (0) 编辑
摘要:原文:http://www.cnblogs.com/jishu/archive/2011/04/27/2030921.html 大数据量的问题是很多面试笔试中经常出现的问题,比如baidu google 腾讯 这样的一些涉及到海量数据的公司经常会问到。 下面的方法是我对海量数据的处理方法进行了一个一般性的总结,当然这些方法可能并不能完全覆盖所有的问题,但是这样的一些方法也基本可以处理绝大多数遇到 的问题。下面的一些问题基本直接来源于公司的面试笔试题目,方法不一定最优,如果你有更好的处理方法,欢迎与我讨论。1.Bloom filter适用范围:可以用来实现数据字典,进行数据的判重,或者集合求交. 阅读全文
posted @ 2012-03-26 00:03 Gwa 阅读 (55) 评论 (0) 编辑
摘要:原文:typedef函数指针的用法(C++) 代码简化, 促进跨平台开发的目的. typedef 行为有点像 #define 宏,用其实际类型替代同义字。 不同点:typedef 在编译时被解释,因此让编译器来应付超越预处理器能力的文本替换。用法一:typedefint(*MYFUN)(int, int);这种用法一般用在给函数定义别名的时候上面的例子定义MYFUN是一个函数指针, 函数类型是带两个int 参数, 返回一个int在分析这种形式的定义的时候可以用下面的方法:先去掉typedef 和别名,剩下的就是原变量的类型.去掉typedef和MYFUN以后就剩:int (*)(int, in 阅读全文
posted @ 2012-03-24 00:48 Gwa 阅读 (87) 评论 (0) 编辑