我应该使用管道还是重定向来输入“排序”

我应该使用管道还是重定向来输入“排序”

我想要做

awk -F "," '{print $1 }' inputfile1.txt | sort -u > distinctOutput.txt

这在性能方面好吗?或者我应该重定向/使用临时文件,因为我认为最好让排序等到 awk 完成转储完整输出?或者这是内部处理的?

(AIX 6.1)

答案1

我认为sort自动使用临时文件。文中多处提到了临时工maninfo的页面sort,包括:

   --compress-program=PROG
          compress temporaries with PROG; decompress them with PROG -d
   -T, --temporary-directory=DIR
          use  DIR  for temporaries, not $TMPDIR or /tmp; multiple options
          specify multiple directories

如果设置了环境变量 TMPDIR,sort 将使用其值作为临时文件的目录,而不是 /tmp。 --temporary-directory (-T) 选项又会覆盖环境变量。


为了测试,我跑了:

base64 < /dev/urandom | sort

内存使用量很快稳定base64下来sorttop -bn1 | grep 'base64|sort'):

21877 root      20   0   11.1m   0.6m   0.5m R  63.9  0.0   7:23.46 base64
21878 root      20   0   21.4m   8.2m   0.8m R  31.9  0.4   4:44.15 sort

我可以在/tmp调用中看到数百个临时文件sortXXXXXX

$ ls /tmp/sort* | head
/tmp/sort03IIcQ
/tmp/sort052vXK
/tmp/sort07ZCcO
/tmp/sort09yrTN
/tmp/sort0anX08
/tmp/sort0BruPR
/tmp/sort0EgCYY
/tmp/sort0GsbQs
/tmp/sort0hCMDD
/tmp/sort0hdSMT
$ ls /tmp | grep -c sort
1990

所以,我想说你不必担心临时文件sort。您能做的最好的事情就是确保临时文件的位置位于快速文件系统(SSD 或tmpfs等)上。

免责声明:我只考虑过 GNU 排序。


虽然上述分析仅适用于 GNU 排序,AIXsort根据链接的手册,还使用临时文件,或者至少是临时文件的目录。我没有方便的 AIX 系统来测试它。

POSIX没有提到临时文件,所以这不是给定的。

答案2

我用一个巨大的文件(逗号分隔,csv,2173762 行,186MB)测试了行为

awk通过管道sort给我提供了 49611 个系统调用和:

real    0m5.134s
user    0m5.048s
sys     0m0.080s

awk到一个临时文件,然后sort第二步中的文件给了我 49719 个系统调用,并且:

real    0m6.006s
user    0m5.836s
sys     0m0.152s

即使是另一种方式,sort( sort -k1 -u) 首先并管道awk给我一个更糟糕的结果(47533 系统调用):

real    0m17.937s
user    0m17.565s
sys     0m0.348s

结论:看来你已经找到了最资源友好的方法,或者我找不到更快的方法。

  • awk:mawk 1.3.3 Nov 1996, Copyright (C) Michael D. Brennan
  • 种类:sort (GNU coreutils) 8.13

相关内容