为了账号安全,请及时绑定邮箱和手机立即绑定

UNIX排序命令如何排序一个非常大的文件?

UNIX排序命令如何排序一个非常大的文件?

缥缈止盈 2019-08-31 16:25:48
UNIX sort命令可以像这样对一个非常大的文件进行排序:sort large_file排序算法是如何实现的?为什么它不会导致过多的内存消耗?
查看完整描述

3 回答

?
不负相思意

TA贡献1777条经验 获得超10个赞

UNIX Sort命令的算法细节说Unix Sort使用外部R-Way合并排序算法。链接进入更多细节,但实质上它将输入分成较小的部分(适合内存),然后在结尾处将每个部分合并在一起。


查看完整回答
反对 回复 2019-08-31
?
手掌心

TA贡献1942条经验 获得超3个赞

该sort命令将工作数据存储在临时磁盘文件中(通常在/tmp)。


查看完整回答
反对 回复 2019-08-31
?
月关宝盒

TA贡献1772条经验 获得超5个赞

警告:此脚本为每个块启动一个shell,对于非常大的文件,这可能是数百个。


这是我为此目的编写的脚本。在4处理器的机器上,它将分拣性能提高了100%!


#! /bin/ksh


MAX_LINES_PER_CHUNK=1000000

ORIGINAL_FILE=$1

SORTED_FILE=$2

CHUNK_FILE_PREFIX=$ORIGINAL_FILE.split.

SORTED_CHUNK_FILES=$CHUNK_FILE_PREFIX*.sorted


usage ()

{

     echo Parallel sort

     echo usage: psort file1 file2

     echo Sorts text file file1 and stores the output in file2

     echo Note: file1 will be split in chunks up to $MAX_LINES_PER_CHUNK lines

     echo  and each chunk will be sorted in parallel

}


# test if we have two arguments on the command line

if [ $# != 2 ]

then

    usage

    exit

fi


#Cleanup any lefover files

rm -f $SORTED_CHUNK_FILES > /dev/null

rm -f $CHUNK_FILE_PREFIX* > /dev/null

rm -f $SORTED_FILE


#Splitting $ORIGINAL_FILE into chunks ...

split -l $MAX_LINES_PER_CHUNK $ORIGINAL_FILE $CHUNK_FILE_PREFIX


for file in $CHUNK_FILE_PREFIX*

do

    sort $file > $file.sorted &

done

wait


#Merging chunks to $SORTED_FILE ...

sort -m $SORTED_CHUNK_FILES > $SORTED_FILE


#Cleanup any lefover files

rm -f $SORTED_CHUNK_FILES > /dev/null

rm -f $CHUNK_FILE_PREFIX* > /dev/null


查看完整回答
反对 回复 2019-08-31
  • 3 回答
  • 0 关注
  • 633 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信