В 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/'