Limite de tamanho do arquivo excedido em bash

6

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

o script tem um problema assim:

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

o tamanho do arquivo é de cerca de 3,2 G e recebo uma mensagem de erro: Limite de tamanho de arquivo excedido

neste shell, ulimit -f é ilimitado

depois de alterar o script para este

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 18.09.2012 / 07:09

1 resposta

2

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 18.09.2012 / 09:26

Tags