저는 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/'