В 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

проблема ушла

Я не знаю почему, кто-нибудь может мне помочь с объяснением?

1 ответ

Версии канала требуется намного больше временных файлов. Вы можете проверить это быстро с помощью утилиты strace.

Версия канала использует быстро растущее количество временных файлов:

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/'
Другие вопросы по тегам