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


Я пробовал этот сценарий оболочки на сервере SUSE 10, ядре 2.6.16.60, файловой системе ext3

сценарий имеет такую ​​проблему:

cat file | awk '{print $1" "$2" "$3}' | sort -n > result

размер файла составляет около 3.2G, и я получаю такое сообщение об ошибке: Превышен предел размера файла

в этой оболочке ulimit -f неограничен

после смены сценария на этот

cat file | awk '{print $1" "$2" "$3}' >tmp
sort -n tmp > result

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

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


6
2017-09-18 05:09


Источник




Ответы:


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

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

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

2
2017-09-18 07:26



Я думаю, что дело не в этом, сортировка будет использовать много временных файлов, если отсортированный файл большой, но размер каждого временного файла невелик, чтобы вызвать эту ошибку. - yboren