Devo usar tubulação ou redirecionamento para entrada para 'classificar'

2

Eu quero fazer

awk -F "," '{print $1 }' inputfile1.txt | sort -u > distinctOutput.txt

Isso é bom em termos de desempenho? Ou eu deveria redirecionar / usar um arquivo temporário desde que eu acho que é melhor fazer o tipo esperar até que o awk é feito despejando a saída completa? Ou isso é cuidado internamente?

(AIX 6.1)

    
por dbza 17.09.2014 / 01:38

2 respostas

3

Acho que sort usa arquivos temporários automaticamente. Temproários são mencionados em vários lugares no man e info páginas para sort , incluindo:

   --compress-program=PROG
          compress temporaries with PROG; decompress them with PROG -d
   -T, --temporary-directory=DIR
          use  DIR  for temporaries, not $TMPDIR or /tmp; multiple options
          specify multiple directories

If the environment variable TMPDIR is set, sort uses its value as the directory for temporary files instead of /tmp. The --temporary-directory (-T) option in turn overrides the environment variable.

Para testar, eu corri:

base64 < /dev/urandom | sort

O uso de memória de base64 e sort estabilizou rapidamente ( top -bn1 | grep 'base64|sort' ):

21877 root      20   0   11.1m   0.6m   0.5m R  63.9  0.0   7:23.46 base64
21878 root      20   0   21.4m   8.2m   0.8m R  31.9  0.4   4:44.15 sort

Eu pude ver centenas de arquivos temporários em /tmp chamados sortXXXXXX :

$ ls /tmp/sort* | head
/tmp/sort03IIcQ
/tmp/sort052vXK
/tmp/sort07ZCcO
/tmp/sort09yrTN
/tmp/sort0anX08
/tmp/sort0BruPR
/tmp/sort0EgCYY
/tmp/sort0GsbQs
/tmp/sort0hCMDD
/tmp/sort0hdSMT
$ ls /tmp | grep -c sort
1990

Então, eu diria que você não precisa se preocupar com arquivos temporários com sort . A melhor coisa que você pode fazer é garantir que o local dos temporários esteja em um sistema de arquivos rápido (um SSD, ou tmpfs , etc.).

AVISO LEGAL: Eu considerei apenas o tipo de GNU.

Embora a análise acima se aplique apenas à classificação GNU, o AIX sort também usa arquivos temporários, ou pelo menos um diretório para arquivos temporários, de acordo com o manual vinculado. Eu não tenho um sistema AIX à mão para testá-lo.

POSIX não menciona arquivos temporários, então isso não é um dado .

    
por 17.09.2014 / 02:02
2

Eu testei o comportamento com um arquivo enorme (separado por vírgula, csv, 2173762 linhas, 186MB)

awk canalizado para sort me fornece, 49611 syscalls e:

real    0m5.134s
user    0m5.048s
sys     0m0.080s

awk para um arquivo temporário e, em seguida, sort o arquivo em uma segunda etapa me fornece 49719 syscalls e:

real    0m6.006s
user    0m5.836s
sys     0m0.152s

Mesmo de outra forma, sort ( sort -k1 -u ) primeiro e pipe para awk me dão um resultado pior (47533 syscalls):

real    0m17.937s
user    0m17.565s
sys     0m0.348s

Conclusão : parece que você já encontrou o método mais adequado para recursos, ou não consigo encontrar um método mais rápido.

  • awk: mawk 1.3.3 Nov 1996, Copyright (C) Michael D. Brennan
  • classificar: sort (GNU coreutils) 8.13
por 17.09.2014 / 08:26