Limite de tamanho de arquivo excedido em bash [closed]

4

Eu tentei este script de shell em um servidor SUSE 10, kernel 2.6.16.60, sistema de arquivos ext3.

O script tem uma linha como esta:

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

O tamanho do arquivo é de cerca de 3,2 G e recebo a seguinte mensagem de erro: File size limit exceeded .

Neste shell, ulimit -f é ilimitado.

Depois de alterar o script para isso:

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

o problema desapareceu.

Eu não sei porque, alguém pode me ajudar com uma explicação?

    
por yboren 20.09.2012 / 10:44

1 resposta

1

Veja pergunta duplicada no serverfault:

A versão do pipe precisa de muito mais arquivos temporários. Você pode inspecionar isso rapidamente com o utilitário strace .

A versão do pipe usa um número explosivo rápido de arquivos temporários:

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

A versão do arquivo não usa arquivos temporários para o mesmo conjunto de dados. Para conjuntos de dados maiores, usa arquivos temporários muito menores.

for i in {1..200000} ; do echo $i ; done >/tmp/TESTDATA ; strace sort -n /TMP/TESTDATA |& grep -e 'open.*/tmp/'
    
por 20.09.2012 / 11:30

Tags