¿La función “abierta” de Python guarda su contenido en la memoria o en un archivo temporal?

Para el siguiente código de Python:

fp = open('output.txt', 'wb') # Very big file, writes a lot of lines, n is a very large number for i in range(1, n): fp.write('something' * n) fp.close() 

El proceso de escritura anterior puede durar más de 30 min. A veces me sale el error MemoryError . ¿Se guarda el contenido del archivo antes de cerrarlo en la memoria o está escrito en un archivo temporal? Si está en un archivo temporal, ¿cuál es su ubicación general en un sistema operativo Linux?

Editar:

Agregado fp.write en un bucle for

Se almacena en la memoria caché del disco del sistema operativo en la memoria hasta que se descarga en el disco, ya sea implícitamente debido a problemas de tiempo o espacio, o explícitamente a través de fp.flush() .

Habrá buffer de escritura en el kernel de Linux, pero a intervalos regulares se irán al disco. La ejecución de dicho espacio de búfer nunca debe causar un error de memoria a nivel de aplicación; los buffers deben vaciarse antes de que eso suceda, pausando la aplicación mientras lo hace.

Sobre la base del comentario de Ataylor a la pregunta:

Es posible que desee anidar su bucle. Algo como

 for i in range(1,n): for each in range n: fp.write('something') fp.close() 

De esa manera, lo único que se pone en la memoria es la cadena "something" , no "something" * n .

Si escribe un archivo grande para el cual las escrituras pueden fallar, fp.flush() el archivo en el disco a intervalos regulares utilizando fp.flush() . De esta manera, el archivo estará en una ubicación de su elección a la que podrá acceder fácilmente en lugar de estar a merced del sistema operativo:

 fp = open('output.txt', 'wb') counter = 0 for line in many_lines: file.write(line) counter += 1 if counter > 999: fp.flush() fp.close() 

Esto vaciará el archivo al disco cada 1000 líneas.

Si escribe línea por línea, no debería ser un problema. Debes mostrar el código de lo que estás haciendo antes de escribir. Para empezar, puede intentar eliminar objetos donde no sea necesario, use fp.flush() etc.

La escritura del archivo nunca debe dar un error de memoria; Con toda probabilidad, tienes algún error en otro lugar.

Si tiene un bucle y un error de memoria, buscaría si está “perdiendo” referencias a objetos.
Algo como:

 def do_something(a, b = []): b.append(a) return b fp = open('output.txt', 'wb') for i in range(1, n): something = do_something(i) fp.write(something) fp.close() 

Ahora estoy escogiendo solo un ejemplo, pero en su caso real la fuga de referencia puede ser mucho más difícil de encontrar; sin embargo, este caso solo perderá memoria dentro de do_something debido a la forma en que Python maneja los parámetros predeterminados de las funciones.