赞
踩
需求1: 将1T文件排序,这个文件的每一行都是一个数字
环境: 一台服务器 64G内存
看到这个需求,我们心中第一个想法是将大文件切割成小文件,然后小文件进行内部排序,然后用归并排序法将小文件合并成为一个大文件。
这里介绍一下归并排序法:
归并排序是指将两个及以上的有序的文件,读取前n个到内存中
每一个存到一个buffer里,在比较各个buffer中的第一个元素,将小的或者大的(正序/倒序)写入文件,并且从buffer剔除,继续比较第一个元素,直到全部比较完毕。
这里我们分析一下:将大文件切割成小文件时需要一次磁盘IO,在做小文件内部排序是有需要一次磁盘IO,排好序后最后执行归并排序的时候又需要一次磁盘IO,也就是说,实现上述需求需要三次磁盘IO。
那有没有更好的方法呢?
我们可以在切割小文件的时候加一个规则,我们将数值在0 ~ 100的数字切割出来放在一个小文件中,101~200之间的数据放在另一个小文件中,按照这样我们可以实现将一个大文件切割成为若干个小文件,文件内部是无序的,而文件之间是有序的。接着我们再进行一次文件内部的排序,那所有文件收尾拼接起来就实现了对大文件的排序。这种方式只有两次磁盘IO。一次为切割的时候,一次为小文件内部排序。
需求2: 在两个各有10亿条URL的文件中找到同时在两个文件中出现过的URL
环境: 一台服务器 64G内存
思路:计算每个URL的HashCode,然后按照除以1000的,切割到1000个小文件中,此时我们知道相同的URL的HashCode也相等,所以相同URL肯定会被放在同一个文件中,这样我们去遍历一个个的小文件就可以找到相同的URL。
结论
通过上述两个案例其实就是锻炼一下我们的分布式解决问题的思维方式。我们不难看出,分布式计算的核心思想就是分久必合——将大文件分割成为小文件,处理计算完毕之后再讲结果合并。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。