Назад | Перейти на главную страницу

Превышен предел размера файла в bash

Я пробовал этот сценарий оболочки на сервере 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/'