我可以并行化排序吗?


13

例如,bzippbzip,它是的并行版本bzip。是否有任何此类并行化工具sort可以提高性能?

Answers:


12

从coreutils 8.6(2010-10-15)开始,GNU sort已经并行排序以使用多个可用的处理器。因此,就此而言,不能像pigzpbzip2改进gzip或那样进一步加以改进bzip2

如果sort不是并行的,则可以尝试sort从最新版本的GNU coreutils安装GNU

使用GNU sort,您可以使用该--parallel选项限制线程数。


2
sort --stable至少在我的测试工作负载中将性能提高了15%。
jrw32982支持Monica 2015年

8

在排序方面最能帮助我的一件事就是给它尽可能多的内存,以减少交换,例如:

sort -S 20G

4
谢谢,这也是我最近使用的一种技巧-如果需要的话,让我们使用一半的RAM:sort -S 50%
miku 2015年

6

如果文件足够大,排序将导致磁盘交换,这可能是由于分配的虚拟内存变得太大,或者是因为sort程序本身正在将块交换到磁盘,然后又交换回来。较旧的sort实现更可能具有这种“通过磁盘缓冲区排序”的行为,因为这是过去对大文件进行排序的唯一方法。

sort有一个-m可能对您有所帮助的选项。将文件拆分为多个块(例如,使用split -l)进行独立排序,然后将它们合并回一起可能会更快。

再一次,这可能正是“通过磁盘缓冲区排序”所做的。找出是否有帮助的唯一方法是根据您的特定测试负载进行基准测试。关键参数将是您给的行数split -l


感谢您的回答。我会进行一些基准与splitmerge,看看是否有帮助。
miku

@miku:我认为merge(1)这里没有适用性。使用sort -m
沃伦·杨

1
对不起,我的意思是宽容sort --merge
miku

1
如果您拆分文件并对文件进行排序,那么当您将文件放回原处时,仍然需要对整个文件进行排序,对吗?怎么会更快?
terdon

2
这是合并排序算法的一种变体,它是可用的最快的排序方法之一。
沃伦·杨

3

使用sort -n,我获得了很大的收获,它在所有选定的列中都需要数字值(浮点数或整数),而没有科学计数法。

另一种可能在您的过程中带来很大改进的可能性是使用内存映射的文件夹/dev/shm来处理中间文件。


3
export LC_COLLATE=C
export LANG=C
cat big_file | sort > /dev/null

通常,Linux排序会做一些很有趣的事情来遵守Unicode相等规则...如果将语言环境更改为C,它将切换为仅字节...

对于1.4GB的文件,我的机器上的差异是20s与400s(!!!)


谢谢,但是还LC_ALL=C不够吗?
2015年

我想是吧……也许LC_COLLATE已经足够了。据我所知sort用途strcoll用于对比和联机帮助说这种行为取决于LC_COLLATE
mt_

0
#! /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

文件被分割并排序将提高排序速度


1
嗨!可以通过解释其含义而不是仅仅作为代码转储来改进此答案(而且,如果已经对它进行了基准测试,它比某些输入上的GNU排序要快,那将很有趣!)。
dhag 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.