このシェルスクリプトをSUSE10サーバー、カーネル2.6.16.60、ext3ファイルシステムで試しました。
スクリプトには次のような行があります。
cat file | awk '{print $1" "$2" "$3}' | sort -n > result
ファイルのサイズは約3.2Gで、次のエラーメッセージが表示されます。File size limit exceeded
。
このシェルでは、ulimit -f
は無制限です。
スクリプトを次のように変更した後:
cat file | awk '{print $1" "$2" "$3}' >tmp
sort -n tmp > result
問題はなくなりました。
理由はわかりませんが、誰かが説明を手伝ってくれますか?
serverfaultの重複した質問: を参照してください
パイプバージョンには、さらに多くの一時ファイルが必要です。 straceユーティリティを使用すると、これをすばやく調べることができます。
パイプバージョンは、急速に爆発する数の一時ファイルを使用します。
for i in {1..200000} ; do echo $i ; done |strace sort -n |& grep -e 'open.*/tmp/'
open("/tmp/sortb9Mhqd", O_RDWR|O_CREAT|O_EXCL, 0600) = 3
open("/tmp/sortqKOVvG", O_RDWR|O_CREAT|O_EXCL, 0600) = 3
open("/tmp/sortb9Mhqd", O_RDONLY) = 3
open("/tmp/sortqKOVvG", O_RDONLY) = 4
ファイルバージョンは、同じデータセットの一時ファイルを使用しません。より大きなデータセットの場合、使用する一時ファイルは非常に少なくなります。
for i in {1..200000} ; do echo $i ; done >/tmp/TESTDATA ; strace sort -n /TMP/TESTDATA |& grep -e 'open.*/tmp/'