近日团队举办了编程比赛,题目是:解析一个大文件,用最快的速度统计出出前频率最高的前十个单词。终最得了第四。这里我说说个人作法:html
首先,大体看了一下你们的代码,发现你们都是本身去实现多线程的,其实不必,能够利用openMP只须要几行注解就能够实现并行计算,例如:编程
编译器就会自动编译启动cpu_count个线程来计算,很爽,有木有!编译时只须要加上两个参数就能够了,只是要gcc4.1之后的都支持多线程
另外就是无锁hash_table,这个能够参看个人博客:http://www.seflerzhou.net/post-6.htmlide
最后我使用了一种并行合并排序来统计前十的单词,使用openMP也就几行代码,很简单的,以下:post
除些以外我还使用文件内存映射,单词hash在扫描时就进行计算(就是扫一个byte算一个,直到非ASCII码,就能够获得本些单词的hash),这样基本上就能够到3s左右,但lf_hash的问题是使用了__sync_add_and_fetch来统计出现频率,虽然能够无锁,但总的来讲仍是串行的,所以我就把原来的int改为int[],每一个线程一个,这样每一个线程都只写本身的,不存在竞争区,最后在取出全部entries的时候再进行合并,以下:fetch
从而统计出总的值.net