从2TB文件中提取前20条记录,这些记录不适合交换分区和内存

时间:2016-03-19 02:04:44

标签: linux bash shell sorting

我在磁盘上有一个2TB文件,并希望通过第二列对其进行数字排序。 (事实上​​,我只需要前20条记录)。

我尝试了什么:

sort -k2nr 2tbfile.log | head -20

运行几分钟后,我收到一个错误 - 没有足够的磁盘空间。

对这种大规模数据进行排序的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

由于您只需要前20条记录,因此对整个文件进行排序会占用大量内存(RAM或交换或临时空间)。有一种算法可以提取前20个(或许多你想要的)记录,但我不认为有一个标准的命令行工具可以实现它。

该算法(称为“部分排序”)使用优先级队列,您可以使用任意数量的语言实现,包括bash,但在bash中会很痛苦。事实上,该算法已经在Python标准库中实现,这使得脚本很短:

@media (min-width: 768px)

以下是您如何使用它:

#!/usr/bin/python

import heapq
import sys

records = ((int(line.split()[1]), line) for line in sys.stdin)
top = heapq.nlargest(20, records)
for pair in top:
    print pair[1],