私はSUSE 10サーバー、カーネル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
問題が解決しました。
なぜそんなのか分からないが、誰が私に説明できるのか?
ベストアンサー1
バラよりサーバーエラーによる重複の問題:
パイプラインバージョンにはより多くの一時ファイルが必要です。次のコマンドを使用すると、すばやく確認できます。ストレス便利です。
パイプラインバージョンは、急速に増加する一時ファイルの数を使用します。
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/'