Performance - Maneira rápida de ler/escrever grandes arquivos

328 views
Skip to first unread message

Juliano

unread,
Aug 13, 2015, 9:15:09 PM8/13/15
to python...@googlegroups.com
Boa noite pessoal, tenho um problema e conto com a ajuda de vocês.

Tenho um arquivo de aproximadamente 1,6G e devo lê-lo linha a linha, processá-lo e posteriormente, escrever algumas informações. Estimo que a cada 10 linhas mais ou menos, escreverei uma nova linha em um arquivo de saída.

A minha dúvida é:

Quais são as medidas que tenho que tomar para deixar essas operações tão rápidas quanto possível?
Devo passar um tamanho de buffer para a função open?

Bom, qualquer dica é muito bem vinda.

Obrigado
Juliano

Marcos Thomaz

unread,
Aug 14, 2015, 2:20:00 AM8/14/15
to python...@googlegroups.com
Normalmente ler/escrever em modo binário é um pouco mais rápido.  

--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com

---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.



--


Marcos Thomaz da Silva
Analista de Tecnologia da Informação

Linux - Junior Polegato

unread,
Aug 14, 2015, 3:34:22 AM8/14/15
to python...@googlegroups.com
Olá!

O primeiro ponto a considerar é o cache de disco, não sei afirmar em
Windows, mas no Linux, se tiver memória suficiente, teremos esse cenário:

1. Primeira vez que ler o arquivo de 1,3 GB, média 93 MB/s:

$ time cat teste.txt > /dev/null
real 0m14.302s
user 0m0.016s
sys 0m0.720s

2. Segunda vez, lê da memória, pois o Linux fez cache desse arquivo, 5,5
GB/s:

$ time cat teste.txt > /dev/null
real 0m0.236s
user 0m0.004s
sys 0m0.228s

3. Limpando o cache no Linux, volta-se ao "normal":

$ su -c 'echo 3 > /proc/sys/vm/drop_caches'
Senha:
$ time cat teste.txt > /dev/null
real 0m14.550s
user 0m0.020s
sys 0m0.712s

Como pode ver, uma vez lido, as próximas vezes pouco vai interessar esse
tempo de leitura para o ser humano esperar.

Outro ponto a considerar é se o arquivo de saída e entrada estão no
mesmo dispositivo, se sim, melhor jogar os dados de saída na memória e
depois gravar de uma vez, caso contrário pode-se ir gravando pra ganhar
tempo.

Em todo caso, vejo que o ganho de desempenho será sempre o melhor quando
a leitura é feita continuamente e de forma binária, sem parar para
processar a cada linha lida, assim sendo, é melhor ler numa thread um
bloco "grande" de dados, e processar em outra.

Mais um ponto é se o processamento desse bloco leva mais tempo que a
leitura de outro bloco do arquivo, se sim, melhor usar multiprocessamento.

Do mais, se tiver memória e processamento "abundante", para essa carga,
melhor ler tudo, processar e gravar a cada linha encontrada, pois a
gravação faz cache também, principalmente se for gravar no mesmo
dispositivo que vai ler, visto que aí estimo pouquíssimo ganho com
thread/multiprocessamento no final das contas.

--

[]'s

Junior Polegato

Victor Augusto Furtado Leite

unread,
Aug 14, 2015, 8:56:30 AM8/14/15
to python...@googlegroups.com
Caso você for iterar nesse arquivo, acho importante você fazer a iteração direto no objeto do arquivo, sem chamar métodos como readlines() ou read().

f = open(r'file.dat')
# for line in f.readlines(): vai construir uma lista em memória com aproximadamente o tamanho do seu arquivo, o que pode ser bem custoso.
for line in f: # vai iterar sobre o arquivo lendo uma linha por vez sem o custo da geração de uma lista enorme, porém vai te gerar muito mais IOs

[]s


--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar

<*> Para visitar o site do grupo na web, acesse:
   http://groups.google.com/group/python-brasil

<*> Para sair deste grupo, envie um e-mail para:
   python-brasi...@googlegroups.com

--- Você está recebendo esta mensagem porque se inscreveu no grupo "Python Brasil" dos Grupos do Google.

Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/d/optout.



--
Victor

Diego Garcia

unread,
Aug 14, 2015, 8:57:27 AM8/14/15
to python-brasil
Considere trabalhar com threads.
Para operações de IO o python libera a GIL então você consegue tirar proveito de threads
--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar

<*> Para visitar o site do grupo na web, acesse:
   http://groups.google.com/group/python-brasil

<*> Para sair deste grupo, envie um e-mail para:
   python-brasi...@googlegroups.com

Sinval Júnior

unread,
Aug 14, 2015, 9:45:20 AM8/14/15
to python...@googlegroups.com
Juliano, 

Seu arquivos tem qual formato? dependendo do formato uso pandas [1], ou o Spark [2].






Ao encaminhar esta mensagem, por favor:
1 - Apague meu endereço eletrônico;
2 - Encaminhe como Cópia Oculta (Cco ou BCc) aos seus destinatários. Dificulte assim a disseminação de vírus, spams e banners.

#=================================================================+
#!/usr/bin/env python
nome = 'Sinval Júnior'
email = 'sinvalju arroba gmail ponto com'
print nome
print email
#==================================================================+

--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com

---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.

Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Victor Augusto Furtado Leite

unread,
Aug 14, 2015, 9:47:44 AM8/14/15
to python...@googlegroups.com
Diego, você me deixou com algumas dúvidas agora...

Operações de IO em python são thread-safe? Mais de uma thread vai conseguir acessar o mesmo arquivo?

E mesmo que antes ele leia todo o arquivo pra uma lista/string esses tipos são thread-safe?

[]s


Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.

Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Victor

Reply all
Reply to author
Forward
0 new messages