我想要做
awk -F "," '{print $1 }' inputfile1.txt | sort -u > distinctOutput.txt
这在性能方面好吗?或者我应该重定向/使用临时文件,因为我认为最好让排序等到 awk 完成转储完整输出?或者这是内部处理的?
(AIX 6.1)
答案1
我认为sort
自动使用临时文件。文中多处提到了临时工man
和info
的页面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
下来sort
(top -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