Я пробовал этот сценарий оболочки на сервере SUSE 10, ядро 2.6.16.60, файловая система ext3
у скрипта есть такая проблема:
cat file | awk '{print $1" "$2" "$3}' | sort -n > result
размер файла составляет около 3,2 ГБ, и я получаю такое сообщение об ошибке: Превышен предел размера файла
в этой оболочке ulimit -f не ограничен
после того, как я изменил сценарий на этот
cat file | awk '{print $1" "$2" "$3}' >tmp
sort -n tmp > result
проблема ушла.
Не знаю почему, может ли кто-нибудь помочь мне с объяснением?
Версия pipe требует намного больше временных файлов. Вы можете быстро это проверить с помощью Strace утилита.
Версия pipe использует быстро растущее количество временных файлов:
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/'