所以我有一个非常大的文件(大约10GB),需要对它进行sorting,就像使用“sorting”工具一样,但更有效。
问题是,我没有内存,CPU的能力,时间,也没有自由的交换空间来供电。
好的是文件已经部分sorting了(我可以说每行与最终位置的距离都小于某个值N)。 这种提醒我为此目的使用堆大小为N的heapsort的经典计算机级示例。
问题:是否有一些unix工具已经有效地执行了,还是我需要自己编写一个?
谢谢-mk
将文件拆分成更小的部分并对其进行sorting会更容易。 分开:-
split --lines=100000 large_file file_part.
然后通过使用正常的sorting对每一个进行sorting
for suffix in `ls file_part.* | cut -f2 -d.` do sort file_part.${suffix} > file_sorted.${suffix} done
你可以通过合并sorting来组合
sort -m file_sorted.*
这应该是在你的机器上更容易。
sorting,正在使用和R-way合并sortingalgorithm。 做你工作的最快方法是:
sort myfile
这意味着O(n logn)时间复杂度和O(n)时间。
如果你划分数据,你可能会花时间来支付。
上面的代码有一个问题。 与sorting-m文件不保证相互sorting。
从unix手册:
-m, --merge merge already sorted files; do not sort
例如
file1:abcklq file2:dem
sort -m file1 file2
abcklqdem
这是不是在sorting。
此外,元素在小于N的位置的事实并不保证上述代码的sorting输出:
文件:aebcdhfg
在N = 3的文件中,所有元素都不到3个位置
file1:hfg,file2:bcd,file3:ae
sort file1
产生:
file1:fgh,file2:bcd,file3:ae
和
sorm -m file3 file2 file1
输出:
aebcdfgh
这是错误的。