如何在单台8G内存机器上实现1TB日志排序

现在有一批日志数据,大小为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个文件进行合并输出,合并的逻辑就是从每个文件中依次获取数据,排序,输出,就像示例中的那样。就可以得到一个最终有序的文件。

你可能感兴趣的:(数据结构和算法)