上一页 1 ··· 6 7 8 9 10 11 12 13 14 ··· 18 下一页

2009年11月3日

内嵌变长数据结构范例——trbstrmap

摘要: 以前的这篇文章介绍了嵌入的变长数据结构(embeded)本文介绍一个使用这种思想实现的通用strmap容器,相当于:std::map。实现上使用了我以前写的线索红黑树——相比标准map的实现,节省了一半的结点存储开销,而平均查找时间只付出很小的额外开销,并且没有代码膨胀问题。使用大多数情况下trbstrmap // Compare是可选的,allocator 总在类范围,可以修改:trbstrmap::s_vtab.alloc = ....;为了节省空间,trbstrmap使用一个字节存储strkey_length,因此,strlen(strkey)不可超过255,允许长度为0的key。最大长 阅读全文

posted @ 2009-11-03 22:13 能发波 阅读(170) 评论(0) 推荐(0)

2009年10月27日

MapReduce做了多余的事情

摘要: MapReduce做了多余的事情本文假定读者已了解MapReduce。MapMap阶段一般做三件事情:1. 切分输入2. 变换输入为输出3. 执行可选的Combine如果要说哪项是多于的,大概就是Combine了。Combine在很多时候可以减少传递给Reduce的数据量;但是,也有一些时候,Combine只是空耗时间:1. Map输入中重复Key很多时,Combine会提高性能2. Map输入中重复Key很少时,Combine会降低性能3. 网络速度很快时,Combine提高的性能有限,甚至不会提高性能作为总结:用不用Combine,一方面取决于数据的特征(重复Key的多寡);另一方面就是网 阅读全文

posted @ 2009-10-27 15:25 能发波 阅读(131) 评论(0) 推荐(0)

MapReduce Key Revert ——特定数据模式的负载均衡

摘要: 符号、记法其中{k,v}指一个Key,Value对,{..} 中第一个分量是Key,第二个是Value。[e]指一个集合,其中的元素为e。[{k,v}]就指一个{k,v}的集合。问题给定巨大的集合S=[{k1,k2}],对S中每个k1,计算k1相同,而k2不同的元素个数。生成[{k1,distinct_count([k2])}]。其中S数据的特点是:1. 不同k1的数目很少(少于1K,很可能小于机器数目);2. 不同k2的数目很大(大于20M);3. 总的记录数目很大(大于1G);4. k1的分布很不均匀,最频繁的k1,其记录数占到总数的1/3,对应的独立k2几乎包括整个k2集合;5. k2的 阅读全文

posted @ 2009-10-27 11:45 能发波 阅读(216) 评论(0) 推荐(0)

2009年10月23日

memory pool 的高效实现(代码)

摘要: mpool.h#ifndef __febird_c_mpool_h__#define __febird_c_mpool_h__#ifdef __cplusplusextern "C" {#endif//------------------------------------------------------------------------------------------typedef void* (*chunk_alloc_ft)(struct chunk_allocator* self, size_t size);typedef void* (*chunk_re 阅读全文

posted @ 2009-10-23 03:01 能发波 阅读(246) 评论(0) 推荐(0)

memory pool 的高效实现

摘要: memory poolmalloc可以分配任意大小的内存,因此,在malloc内部,保存了一些簿记信息(至少有一个包含内存块尺寸的信息)。调用free时,可以正确释放。为了减少这些簿记开销,可以使用memory pool。根据使用情境,可以分为两种:1. 只分配固定大小的内存块,速度最快(normal path约10条机器指令)。2. 可分配不同大小的内存块,速度稍慢,但比malloc快得多,也无簿记开销。以下将分别说明mpoolmpool可分配不同尺寸的内存。大多数时刻,都在内部分配。销毁mpool时,会自动释放在mpool中未释放的内存。mpool内部有一个包含多个不同尺寸fixed_mp 阅读全文

posted @ 2009-10-23 02:40 能发波 阅读(226) 评论(0) 推荐(0)

2009年10月18日

世界上应用最广泛的虚拟机是啥?

摘要: 别说是JavaVM!正确答案:x86vmx86本身是一个硬件vm,它的指令系统是一个vm指令系统,通过翻译层后,才交给下面的risk内核。 阅读全文

posted @ 2009-10-18 16:19 能发波 阅读(154) 评论(0) 推荐(0)

malloc/free 的开销,如何去掉这种开销?

摘要: 一般的malloc实现,对一块已分配的内存,都有两个机器字的簿记,甚至更多。如果不需要排错,理论上讲,只需要一个字长的额外开销,用来记录这块内存的尺寸(放在intptr[-1]处是个好主意)。为什么需要这个开销呢?因为free传入的只是个指针,它不知道要释放多大的内存,因此free内部必须通过某种方式来获得这块内存的尺寸。可以想象,如果用 malloc/free 来作为一个关联数组(map)的分配器,要浪费不少内存。不过好在实际数据的尺寸往往比额外消耗要大很多,相比起来,浪费的比例不算很大,况且现在内存还很便宜。其实,打造一个高效的分配器并不难,难的是它的适用范围(多线程?cell尺寸,chu 阅读全文

posted @ 2009-10-18 15:58 能发波 阅读(411) 评论(0) 推荐(0)

2009年9月27日

可变长度数据结构

摘要: 固定长度的数据结构很简单,大家每天都在用。可变长度数据结构,都可以通过内嵌对象的形式,转化成固定长度的数据结构,大家每天也都在用,例如:struct person{ int id; string name; string address;}; 每个 person 对象的长度是固定的,但是,其内嵌的 name 和 address 是变长的。从而,整个对象占据的总空间也是变长的。但是,将这样的的对象平坦化,使之只占据一块连续空间,使用的人很少,因为在绝大多数情况下,很少有人思考这个问题,并且,大多数问题已经使用内嵌数据结构解决掉了。然而,如果内存很紧张,或者需要处理得数据量... 阅读全文

posted @ 2009-09-27 17:12 能发波 阅读(216) 评论(0) 推荐(0)

2009年7月28日

管道的境界

摘要: 一直在想:如何在 Hadoop.MapReduce 中,插入一个 C 写的 HashFunction,既要高效,又要接口简洁。通过命令行实现调用显然是不行的。刚刚终于想出了:使用管道!一个非常简单的程序,从stdin读入,写到stdout。多简单!至于效率,管道嘛,本质上就是异步的,自然是buffered&asynchronous 模式。hash 程序#include int hash(const char* key){ int h = 234234; for (; *key; ++key) h = h << 3 ^ *key; return h;}int main(in. 阅读全文

posted @ 2009-07-28 20:15 能发波 阅读(88) 评论(0) 推荐(0)

2009年7月13日

fuck淘宝,fuck原叶绿茶

摘要: 昨天,渴了,买了瓶原叶绿茶,准备扣上盖子扔瓶子时,发现上面说:N2KOKC5ND9L 十元淘宝券 兑奖09/11/30止口跑到淘宝上看,找不着哪兑奖,后来终于发现:http://pro.taobao.com/yuanye/yuanye_index.htm输入号码,点击“适用10元抵价券商品区”结果是一大堆给我都不要的东西。我不殚以最坏的恶意来揣摩这些fuckee,可是,这些fuckee却如此侮辱我的智商。而且还是如此公开、如此明目张胆的侮辱。 侮辱了大家的智商,还要浪费大家的时间,浪费大家的精力。如果买了它的东西,在你被侮辱的同时,人家还说:傻逼真乖,把钱给爷! 阅读全文

posted @ 2009-07-13 22:19 能发波 阅读(138) 评论(0) 推荐(0)

上一页 1 ··· 6 7 8 9 10 11 12 13 14 ··· 18 下一页

导航