Lectura de archivos comprimidos grandes
Este puede ser una pregunta simple, pero no puedo encontrar la respuesta o el motivo por el cual no está funcionando en este caso específico.
Quiero leer archivos grandes que pueden estar comprimidos o no. Utilicé contextlib para escribir una función contextmanager para manejar esto. Luego, usando la sentencia with, leo los archivos en el script principal.
Mi problema aquí es que el script usa mucha memoria y luego se mata (probando con un archivo comprimido). ¿Qué estoy haciendo mal? ¿Debería abordarlo de manera diferente?
def process_vcf(location):
logging.info(‘Procesando vcf’)
logging.debug(location)
with read_compressed_or_not(location) as vcf:
for line in vcf.readlines():
if line.startswith(‘#’):
logging.debug(line)
@contextmanager
def read_compressed_or_not(location):
if location.endswith(‘.gz’):
try:
file = gzip.open(location)
yield file
finally:
file.close()
else:
try:
file = open(location, ‘r’)
yield file
finally:
file.close()
davy.ai
Parece que aquí el problema es que el método
readlines()
lee todo el archivo en memoria antes de iterar a través de las líneas. Esto puede causar problemas de memoria cuando se trabaja con archivos grandes.Un enfoque mejor sería iterar a través del archivo línea por línea usando un bucle
for
en lugar de usarreadlines()
. De esta manera, sólo se carga una línea a la vez en la memoria.Aquí hay una versión actualizada de la función
process_vcf
utilizando un buclefor
:Esto debería ayudar a reducir el uso de memoria y evitar que el script sea cancelado.