Intentando cargar un archivo en python. Es un archivo muy grande (1.5Gb), pero tengo la memoria disponible y solo quiero hacer esto una vez (de ahí el uso de Python, solo necesito ordenar el archivo una vez para que Python sea una opción fácil).¿Por qué cargar este archivo requiere tanta memoria?
Mi problema es que al cargar este archivo está dando lugar a manera a mucho uso de memoria. Cuando cargué aproximadamente el 10% de las líneas en la memoria, Python ya está utilizando 700Mb, lo que es claramente demasiado. Alrededor del 50% del script se cuelga, usando 3.03 Gb de memoria real (y aumentando lentamente).
Sé que este no es el método más eficiente para ordenar un archivo (en cuanto a la memoria) pero solo quiero que funcione para poder pasar a problemas más importantes: D Entonces, ¿qué hay de malo con la siguiente pitón código que está causando el uso de la memoria masiva:
print 'Loading file into memory'
input_file = open(input_file_name, 'r')
input_file.readline() # Toss out the header
lines = []
totalLines = 31164015.0
currentLine = 0.0
printEvery100000 = 0
for line in input_file:
currentLine += 1.0
lined = line.split('\t')
printEvery100000 += 1
if printEvery100000 == 100000:
print str(currentLine/totalLines)
printEvery100000 = 0;
lines.append((lined[timestamp_pos].strip(), lined[personID_pos].strip(), lined[x_pos].strip(), lined[y_pos].strip()))
input_file.close()
print 'Done loading file into memory'
EDIT: En caso de que alguien no está seguro, el consenso general parece ser que cada variable asignada se come más y más memoria. Lo "arreglé" en este caso 1) llamando a readLines(), que todavía carga todos los datos, pero solo tiene una sobrecarga variable de 'cadena' para cada línea. Esto carga todo el archivo usando aproximadamente 1.7 Gb. Luego, cuando llamo a lines.sort(), paso una función a la tecla que se divide en pestañas y devuelve el valor de la columna a la derecha, convertido a un int. Esto es lento en términos computacionales, y requiere mucha memoria en general, pero funciona. Aprendí un montón sobre overhad de asignación variable hoy: D
Imagino porque las listas ocupan más espacio en la memoria que la suma de sus partes. –
Es suficiente, pero estamos hablando ~ 5 veces más memoria de la que espero que se consuma. ¡No creo que tomen mucho más! – Hamy
@Hamy Sí, parece demasiado para mí también. –