web-dev-qa-db-ja.com

bashでファイルサイズの制限を超えました

このシェルスクリプトを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

問題はなくなりました。

理由はわかりませんが、誰かが説明を手伝ってくれますか?

4
yboren

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/'
1
H.-Dirk Schmitt