所以我有一个非常大的文件(大约 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
输出:
艾比克
这是错误的。