Python readlines () uso e prática eficiente para leitura
Eu tenho um problema para analisar 1000 de arquivos de texto (cerca de 3000 linhas em cada arquivo de tamanho ~ 400 KB) em uma pasta. Eu li-os usando readlines,
for filename in os.listdir (input_dir) :
if filename.endswith(".gz"):
f = gzip.open(file, 'rb')
else:
f = open(file, 'rb')
file_content = f.readlines()
f.close()
len_file = len(file_content)
while i < len_file:
line = file_content[i].split(delimiter)
... my logic ...
i += 1
Isso funciona completamente bem para amostra de minhas entradas (50.100 arquivos). Quando eu corri em toda a entrada mais de 5 mil arquivos, o tempo gasto foi longe de incremento linear. Eu planejei fazer uma análise de desempenho e fiz uma análise Cprofile. O tempo gasto para os arquivos aumentarem exponencialmente, atingindo taxas piores quando os dados chegam a 7 mil arquivos.
Aqui está o tempo acumulado para readlines, primeiro -> 354 arquivos (amostra da entrada) e segundos -> 7473 arquivos (entrada inteira)
ncalls tottime percall cumtime percall filename:lineno(function)
354 0.192 0.001 **0.192** 0.001 {method 'readlines' of 'file' objects}
7473 1329.380 0.178 **1329.380** 0.178 {method 'readlines' of 'file' objects}
Por causa disso, o tempo gasto pelo meu código não é escalonado linearmente conforme a entrada aumenta. Eu li algumas notas de doc emreadlines()
, onde as pessoas afirmaram que issoreadlines()
lê todo o conteúdo do arquivo na memória e, portanto, geralmente consome mais memória em comparação comreadline()
ouread()
.
Eu concordo com este ponto, mas deve o coletor de lixo limpar automaticamente o conteúdo carregado da memória no final do meu loop, portanto, a qualquer momento minha memória deve ter apenas o conteúdo do meu arquivo atualmente processado certo? Mas há alguma captura aqui. Alguém pode dar algumas dicas sobre esse problema?
Este é um comportamento inerente dereadlines()
ou minha interpretação errada do coletor de lixo python. Bom saber.
Além disso, sugira algumas maneiras alternativas de fazer o mesmo na memória e no tempo de maneira eficiente. TIA.