bash ファイルサイズ制限を超えました。 [閉じる]

bash ファイルサイズ制限を超えました。 [閉じる]

私は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/'

おすすめ記事