erro no awk: “cannot open - too many open files”

1. erro no awk: “cannot open - too many open files”

Juliano Boquett
julianoramone

(usa Ubuntu)

Enviado em 21/08/2017 - 16:03h

Preciso dividir um arquivo em sub-arquivos baseados em um padrão. O arquivo principal é enorme, tem quase 4 milhões de linhas.

Sempre uso awk para isso, mas nunca com um arquivo tão grande (funciona bem até cerca de 100 mil linhas). Acima disso tenho recebido como retorno o seguinte erro:
awk: cannot open "filename" for output (Too many open files)

Estou usando a seguinte linha de comando:

awk '{OFS="\t"; print $1,$2,$3,$4,$12 > $10"_"$8.txt"}' meuarquivo.txt

Em $10 (o padrão onde a divisão será baseada) tem cerca de 4 ou 5 mil expressões diferentes, nas quais preciso dividir o arquivo.

Como posso resolver isso? Usando "close", onde devo inserir este comando? Tenho pouca experiencia com awk.
Estou usando awk na distribuição ubuntu.


  


2. Re: erro no awk: “cannot open - too many open files”

euteste da silva
foxbit3r

(usa Solaris)

Enviado em 21/08/2017 - 17:38h

Você poderia quebrar esse arquivão em arquivos menores...

assim vc executaria:

$ awk instrucoes meuarquivo1.txt
$ awk instrucoes meuarquivo2.txt
$ awk instrucoes meuarquivo3.txt
....

Assim por diante... faz um teste com um arquivo com menos linhas....
Você pode quebrar o arquivo assim: head -n200 meuarquivo.txt > meuarquivo1.txt

boa sorte.


3. Re: erro no awk: “cannot open - too many open files”

Juliano Boquett
julianoramone

(usa Ubuntu)

Enviado em 22/08/2017 - 11:30h

foxbit3r escreveu:

Você poderia quebrar esse arquivão em arquivos menores...

assim vc executaria:

$ awk instrucoes meuarquivo1.txt
$ awk instrucoes meuarquivo2.txt
$ awk instrucoes meuarquivo3.txt
....

Assim por diante... faz um teste com um arquivo com menos linhas....
Você pode quebrar o arquivo assim: head -n200 meuarquivo.txt > meuarquivo1.txt

boa sorte.


Olá, obrigado pelo retorno. Eu havia pensado nisso, mas tenho tido problema com arquivos com mais de 100 mil linhas... sabe qual seria o limite do awk?
Uma opção é usar "close", mas ou estou escrevendo o comando errado ou também não dá certo.


4. Re: erro no awk: “cannot open - too many open files”

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 22/08/2017 - 14:51h

julianoramone escreveu:

Preciso dividir um arquivo em sub-arquivos baseados em um padrão. O arquivo principal é enorme, tem quase 4 milhões de linhas.

Sempre uso awk para isso, mas nunca com um arquivo tão grande (funciona bem até cerca de 100 mil linhas). Acima disso tenho recebido como retorno o seguinte erro:
awk: cannot open "filename" for output (Too many open files)

Estou usando a seguinte linha de comando:

awk '{OFS="\t"; print $1,$2,$3,$4,$12 > $10"_"$8.txt"}' meuarquivo.txt

Em $10 (o padrão onde a divisão será baseada) tem cerca de 4 ou 5 mil expressões diferentes, nas quais preciso dividir o arquivo.

Como posso resolver isso? Usando "close", onde devo inserir este comando? Tenho pouca experiencia com awk.
Estou usando awk na distribuição ubuntu.


Juliano, boa tarde.
Note que o problema ocorre na saída.
cannot open "filename" for output (Too many open files)
não pode abrir o "nome do arquivo" para a saída (muitos arquivos abertos)

Parece que Não entendi direito o seu comando, veja se é isso:
Pega os campos " $1,$2,$3,$4,$12" e salva no arquivo "$10"_"$8.txt"

Quantos "campos" cada linha possui?

att.:
marcelo oliver





5. Re: erro no awk: “cannot open - too many open files”

Juliano Boquett
julianoramone

(usa Ubuntu)

Enviado em 22/08/2017 - 15:14h

msoliver escreveu:

julianoramone escreveu:

Preciso dividir um arquivo em sub-arquivos baseados em um padrão. O arquivo principal é enorme, tem quase 4 milhões de linhas.

Sempre uso awk para isso, mas nunca com um arquivo tão grande (funciona bem até cerca de 100 mil linhas). Acima disso tenho recebido como retorno o seguinte erro:
awk: cannot open "filename" for output (Too many open files)

Estou usando a seguinte linha de comando:

awk '{OFS="\t"; print $1,$2,$3,$4,$12 > $10"_"$8.txt"}' meuarquivo.txt

Em $10 (o padrão onde a divisão será baseada) tem cerca de 4 ou 5 mil expressões diferentes, nas quais preciso dividir o arquivo.

Como posso resolver isso? Usando "close", onde devo inserir este comando? Tenho pouca experiencia com awk.
Estou usando awk na distribuição ubuntu.


Juliano, boa tarde.
Note que o problema ocorre na saída.
cannot open "filename" for output (Too many open files)
não pode abrir o "nome do arquivo" para a saída (muitos arquivos abertos)

Parece que Não entendi direito o seu comando, veja se é isso:
Pega os campos " $1,$2,$3,$4,$12" e salva no arquivo "$10"_"$8.txt"

Quantos "campos" cada linha possui?

att.:
marcelo oliver




Exatamente Marcelo. São 12 campos, dos quais estou selecionando 5 deles a serem salvos em arquivos separados, nomeados com o nome do campo 10 e 8. Funciona perfeitamente em arquivos com até 100 mil linhas, depois disso parece que excede o limite do awk. Precisa fechar o arquivo anterior para abrir o seguinte e assim por diante.


6. Re: erro no awk: “cannot open - too many open files”

euteste da silva
foxbit3r

(usa Solaris)

Enviado em 22/08/2017 - 15:57h

Oi,
você pode tentar assim:



awk 'BEGIN {OFS="\t"; }
{
fileName = $10"_"$8".txt"
print $1,$2,$3,$4,$12 > fileName
close(fileName)
if( (NR % 100000) == 0){
print "Processado",NR,"linhas aguarde ..."
system("sleep 5")
}
}' meuarquivo.txt



Na realidade do limite não é o awk e sim do sistema operacional, pois cada programa na máquina possui um limite de quantidade total que para abrir arquivos. Isso é uma segurança do S.O.



7. Re: erro no awk: “cannot open - too many open files”

Juliano Boquett
julianoramone

(usa Ubuntu)

Enviado em 23/08/2017 - 15:46h

foxbit3r escreveu:

Oi,
você pode tentar assim:



awk 'BEGIN {OFS="\t"; }
{
fileName = $10"_"$8".txt"
print $1,$2,$3,$4,$12 > fileName
close(fileName)
if( (NR % 100000) == 0){
print "Processado",NR,"linhas aguarde ..."
system("sleep 5")
}
}' meuarquivo.txt



Na realidade do limite não é o awk e sim do sistema operacional, pois cada programa na máquina possui um limite de quantidade total que para abrir arquivos. Isso é uma segurança do S.O.


Obrigado fox! Rodei o comando que tu sugeriu, achei genial, porque dá pra acompanhar o andamento do processo. O número total de arquivos divididos está correto, mas quando abri infelizmente o conteúdo não batia. Cada arquivo continha apenas uma linha, quando na verdade muitas linhas possuem um mesmo padrão dentre milhares de padrões diferentes em $10. Provavelmente precisa de algum pequeno ajuste neste comando, poderia testar algumas alternativas a partir do que tu escreveu, mas consegui uma solução que funciona no stackoverflow.

Segue a linha que resolveu meu problema:

awk 'BEGIN{OFS="\t";} {if(prev){close(prev)};print $1,$2,$3,$4,$12 >> ($10"_"$8".txt");prev=$10"_"$8".txt"}' meuarquivo.txt


Dado o tamanho do meu dataset (quase 4 milhões de linhas, contidas em milhares de padrões em $10), a corrida toda levou pouco mais de uma hora. Fiz uma conferencia prévia, manualmente, e parece que funcionou bem.

Agradeço aos colegas pelo tempo dispensado em me ajudar. Grande abraço!


8. Re: erro no awk: “cannot open - too many open files”

euteste da silva
foxbit3r

(usa Solaris)

Enviado em 23/08/2017 - 17:26h

Eu vi que nesse último código é feito um "append", "anexar" com o ">>" que bom que funcionou ai para você!.
Legal =)








Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts