Answers:
从coreutils 8.6(2010-10-15)开始,GNU sort
已经并行排序以使用多个可用的处理器。因此,就此而言,不能像pigz
或pbzip2
改进gzip
或那样进一步加以改进bzip2
。
如果sort
不是并行的,则可以尝试sort
从最新版本的GNU coreutils安装GNU。
使用GNU sort,您可以使用该--parallel
选项限制线程数。
在排序方面最能帮助我的一件事就是给它尽可能多的内存,以减少交换,例如:
sort -S 20G
sort -S 50%
如果文件足够大,排序将导致磁盘交换,这可能是由于分配的虚拟内存变得太大,或者是因为sort
程序本身正在将块交换到磁盘,然后又交换回来。较旧的sort
实现更可能具有这种“通过磁盘缓冲区排序”的行为,因为这是过去对大文件进行排序的唯一方法。
sort
有一个-m
可能对您有所帮助的选项。将文件拆分为多个块(例如,使用split -l
)进行独立排序,然后将它们合并回一起可能会更快。
再一次,这可能正是“通过磁盘缓冲区排序”所做的。找出是否有帮助的唯一方法是根据您的特定测试负载进行基准测试。关键参数将是您给的行数split -l
。
split
和merge
,看看是否有帮助。
merge(1)
这里没有适用性。使用sort -m
。
sort --merge
。
#! /bin/sh
#config MAX_LINES_PER_CHUNK based on file length
MAX_LINES_PER_CHUNK=1000
ORIGINAL_FILE=inputfile.txt
SORTED_FILE=outputfile.txt
CHUNK_FILE_PREFIX=$ORIGINAL_FILE.split.
SORTED_CHUNK_FILES=$CHUNK_FILE_PREFIX*.sorted
#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 -n -t , -k 1,1 $file > $file.sorted &
done
wait
#echo "**********SORTED CHUNK FILES*********"
#echo $SORTED_CHUNK_FILES
#Merging chunks to $SORTED_FILE ...
sort -mn $SORTED_CHUNK_FILES > $SORTED_FILE
#Cleanup any lefover files
rm -f $SORTED_CHUNK_FILES > /dev/null
rm -f $CHUNK_FILE_PREFIX* > /dev/null
文件被分割并排序将提高排序速度