es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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()

Tags:  ,

Answer

  1. Avatar for 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 usar readlines(). 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 bucle for:

    def process_vcf(location):
        logging.info('Procesando vcf')
        logging.debug(location)
        with read_compressed_or_not(location) as vcf:
            for line in vcf:
                if line.startswith('#'):
                    logging.debug(line)
    

    Esto debería ayudar a reducir el uso de memoria y evitar que el script sea cancelado.

Comments are closed.