目录
1. 查找大文件相同两行
题目:有一个2T的文本文件,只存在2行相同的数据,请用一台256M内存的单机服务器,找出这相同的2行数据
解决步骤:
- 读取一条数据A,求A的hashcode,然后取模,即X = a.hashcode % 10000,X的范围为0 ~ 9999,将数据A保存到fileX文件中
- 按步骤1进行文件的遍历,处理剩余的每条数据。这样2T的文件被分割成10000个小文件,但相同的2行数据肯定在同一个小文件中
- 依次处理每个小文件,找出在一个小文件中是否存在相同的两行
2. 大文件全排序
题目:在一个2T的文本文件,每一行都是一个数字,且都不相同,请用一台256M内存的单机服务器对这个乱序的文本文件,进行全排序
方法1:
- 读取一条数据A,如果A的值在[0, 1000000)之间,则将A保存到file0文件中;如果A的值在[1000000, 2000000)之间,则将A保存到file1文件中。根据A的取值范围不同,被划分到不同的文件中,合计10000个小文件
- 按步骤1进行文件的遍历,处理剩余的每条数据。这样2T的文件被分割成10000个小文件,各个小文件之间的数据是外部有序的,每个小文件内部是乱序的
- 依次处理每个小文件,对每个小文件内部的数据进行排序
方法2:
- 一次读取128M数据,进行排序,保存到file0文件中
- 第二次读取128M数据,进行排序,保存到file1文件中
- 依次类推,数据被保存到10000个小文件中。在每个小文件内部数据是有序的,各个小文件之间的数据是无序的
- 采用归并排序,对各个文件之间的数据进行排序
归并排序:
- 将file0文件的第一个数取出来,赋值给变量X0,file1文件的第一个数取出来,赋值给变量X2,依次类推,将file9999文件的第一个数取出来,赋值给变量X9999
- 求出X0 ~ X9999之间的最小值,将其保存到文件file_v_0中
- 再从fileN中取出值赋给XN, 重复步骤2
- 重复步骤3,如果file_v_0小文件的大小,超过128M,则将数据保存到file_v_1小文件中,依次类推。最后保存的小文件为file_v_9999