我已经在 SUSE 10 服务器、内核 2.6.16.60、ext3 文件系统上尝试过这个 shell 脚本
该脚本有这样的问题:
cat file | awk '{print $1" "$2" "$3}' | sort -n > result
该文件的大小约为 3.2G,我收到这样的错误消息:超出文件大小限制
在此 shell 中,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/'