Armazenar saída de texto mais longa na memória nas variáveis shell vs Gravação no disco

2

Eu tenho a chamada abaixo para a ferramenta de linha de comando do banco de dados db2 dentro de um loop, que executa 100k iterações.

(a saída do db2 é de 5 linhas de 20 caracteres aproximadamente por cada chamada, total de aproximadamente 100 mil chamadas. A entrada para o SP é prefixada na linha de saída do SP e descarregada em um arquivo de log.)

while read line
do
    db2 -x "call stored_procedure_XYZ($line)" |sed "s/^/$line/" >>log_file.txt
done<$infile

Eu estou tentando fazer tudo funcionar mais rápido, tirando o sed e o disco de dentro do loop. É aconselhável armazenar toda a saída em uma variável e depois modificá-la e gravá-la no disco?

Qual seria o tamanho que a variável de shell pode conter?

(bash, aix 6.1)

    
por dbza 10.12.2014 / 21:05

1 resposta

5

O tamanho da variável Bash não é fixo. É muito provável manter quantidades arbitrárias de dados contanto que malloc possa encontrar memória suficiente e espaço de endereço contíguo. Vamos supor que você armazenou uma grande quantidade de dados em sua variável. Quando você tenta escrever dados para o seu arquivo, possivelmente você vai ter erro algo assim

/bin/echo ${LARGE_DATA} >> ${YourFile}    
/bin/echo: Argument list too long

Esse erro está relacionado ao tamanho máximo do seu argumento de comando. Por favor, verifique a seção Limites no tamanho dos argumentos e ambiente , que Página man execve link

"...     a memória usada para armazenar o        ambiente e argumentos foram limitados a 32 páginas (definidas por        o kernel constante MAX_ARG_PAGES). Em arquiteturas com 4 kB        tamanho da página, isso produz um tamanho máximo de 128 kB ... "

EDITAR:

Por favor note também que o erro acima para / bin / echo é apenas um exemplo, é possível obter um erro similar, quando você tenta de outras maneiras enquanto escreve um arquivo. É sobre o tamanho do argumento.

SUGESTÃO:

Se pensarmos em escrever operações de arquivo atomicamente, cada canal de tempo é gerado para gravação, os descritores de arquivo são abertos e fechados.Ela leva algum tempo.Em vez de usar / bin / echo ou outros, você pode escrever seu próprio "WriteFile "programa com linguagem de alto nível como C / C ++. O que você precisa é de redirecionamento de E / S.

  1. Abrir descritor de arquivo
  2. Escrever dados
  3. Fechar descritor de arquivo
  4. Otimize seu código
  5. Concluído

    Por favor, verifique as chamadas do sistema como ssize_t write (int fd, const void * buf, size_t count);

    link

por 10.12.2014 / 22:13