当初有一批日志数据,大小为1TB,数据是某一天的生产的日志数据,当初只有一台单CPU及8G内存的机器,请应用算法对此日志数据按工夫的先后顺序进行排序。

解决方案1:桶排序

它的原理是利用分区字段的特点,将数据别离写入到多个桶文件中,再针对每个桶文件应用内存排序算法(如疾速排序),将文件内容进行排序输入到有序桶文件中。最初将这些文件按分桶的程序组合起来,造成最终有序的文件。

  • 划分桶,在问题中,咱们须要排序的是日志中的工夫,而工夫是很容易划分出桶的,而工夫应用哪个维度来划分桶是咱们所面临的问题?如果抉择分钟可失去1440个桶,每个桶均匀就是0.7G左右,但像日志中数据可能有数据集中的问题,尤其是像1TB这么大的日志,顶峰时间段可能是均匀的10倍,分桶可能十分的不均匀;这样倡议再升高维度应用秒,一天可最多失去86400个分桶。均匀每个文件只有12M左右,顶峰也不过才120M,所以抉择秒是比拟适合的分桶。
  • 再将数据按秒划分到各个桶即可。
  • 再将各个桶内的数据进行排序。
  • 最初按桶的先后顺序,合并到一个文件中,就失去了1TB日志的排序后果。

桶排序的特点:

  1. 桶排序的工夫复杂度为O(n),如果有N个数据,划分出M个桶。每个桶内元素(T=N/M),如果桶内排序算法采纳疾速排序,工夫复杂度O(TlogT),M个桶的工夫复杂度就是O(MTlogT),再加上T=N/M,即可失去Nlog(N/M),当M与N靠近时,工夫复杂度为常量级,这时候桶排序工夫复杂度靠近O(N)
  2. 对排序的数据要求很刻薄,数据必须很容易的划分出M个桶,桶与桶之前有着人造的大小程序。对每个桶内的数据排序实现后,桶与桶之前无需再进行排序。
  3. 桶内的数据在各个桶内须必较均匀。如果通过桶的划分。桶内的数据十分不均匀,有的十分多,有的非常少,工夫复杂度将不再是O(N),可能进化为(N*logN)。
  4. 桶排序比拟适宜内部排序。即为对磁盘文件进行排序,因为个别磁盘文件数据量较大,无奈一次全副加载到内存中

解决方案2:归并排序

它的核心思想:分而治之,具原本说就是将大数据分解成一个一个小数据,将小数据进行排序,而后再将这些小数据合并排序成终最终有序的数据。

  • 将1TB的文件按固定大小进行切分,比方大小256M,读取时可按行读取,限度大小在256M以内,需保障残缺的行,这样能够切出大概4096个文件。
  • 将这4096个文件,应用疾速排序算法对这每个文件进行排序操作,可失去4096个排序的文件
  • 将这4096个文件进行合并输入,合并的逻辑就是从每个文件中顺次获取数据,排序,输入,就像示例中的那样。就能够失去一个最终有序的文件。