入力「ソート」にパイプを使用する必要がありますか、それともリダイレクトを使用する必要がありますか?

入力「ソート」にパイプを使用する必要がありますか、それともリダイレクトを使用する必要がありますか?

私がしたい

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

パフォーマンス面では大丈夫ですか?それとも、awkが完全な出力ダンプを完了するまでsortを待つ方が良いと思うので、一時ファイルをリダイレクト/使用する必要がありますか?それとも内部的に処理されますか?

(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

メモリ使用量が速く安定しますbase64sorttop -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パイプを介してsort49611システムコールを提供し、次の操作を行います。

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

awk一時ファイルとして保存し、sort2番目のステップのファイルで49719システムコールが発生しました。

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

別の方法でもsortsort -k1 -u)最初にパイピングすると、awkより悪い結果が出ます(47533システムコール)。

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

結論として:最もリソースに優しい方法を見つけたようです。または、より速い方法が見つかりません。

  • 奇妙な:mawk 1.3.3 Nov 1996, Copyright (C) Michael D. Brennan
  • タイプ:sort (GNU coreutils) 8.13

関連情報