![bash ファイルサイズ制限を超えました。 [閉じる]](https://linux33.com/image/25632/bash%20%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B5%E3%82%A4%E3%82%BA%E5%88%B6%E9%99%90%E3%82%92%E8%B6%85%E3%81%88%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82%20%5B%E9%96%89%E3%81%98%E3%82%8B%5D.png)
私は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/'