对部分有序数据集进行 Unix 排序

对部分有序数据集进行 Unix 排序

所以我有一个非常大的文件(大约 10GB)并且需要对其进行排序,就像使用“排序”实用程序一样,但更有效。

问题是,我没有足够的内存、CPU 能力、时间,也没有可用的交换空间来完成整个排序。

好消息是文件已经部分排序(我可以说每一行与其最终位置的距离都小于某个值 N)。这让我想起了经典的计算机类示例,即为此目的使用大小为 N 的堆进行堆排序。

问题:是否有一些 unix 工具可以有效地做到这一点,还是我需要自己编写一个?

谢谢-mk

答案1

将文件分割成几个小部分并进行排序会更容易。分割方法:-

split --lines=100000 large_file file_part.

然后使用普通排序对每个进行排序

for suffix in `ls file_part.* | cut -f2 -d.` 
do 
  sort file_part.${suffix} > file_sorted.${suffix} 
done

然后你可以组合合并排序

sort -m file_sorted.*

这在您的机器上应该会容易得多。

答案2

排序,使用 R 路合并排序算法。完成工作最快的方法是:

sort myfile

这意味着 O(n logn) 时间复杂度和 O(n) 时间。

如果对数据进行分区,您可能会在时间方面付出代价。

上面的代码有问题。使用 sort -m 时,文件不能保证相互排序。

来自unix手册:

   -m, --merge
          merge already sorted files; do not sort

例如

文件1:abcklq 文件2:dem

sort -m file1 file2 

缩写

这不是一回事。

另外,元素位于小于 N 的位置这一事实并不能保证上述代码的输出已排序:

文件:aebcdhfg

在文件中 N=3 且所有元素的位置都比其正确位置少 3 个位置

文件1: hfg,文件2: bcd,文件3: ae

sort file1

生成:

文件1:fgh,文件2:bcd,文件3:ae

sorm -m file3 file2 file1

输出:

艾比克

这是错误的。

相关内容