2010-02-10 10 views
7

Para el siguiente código Python:¿La función "abrir" de Python guarda su contenido en la memoria o en un archivo temporal?

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

proceso La escritura anterior puede durar más de 30 minutos. A veces recibo el error MemoryError. ¿El contenido del archivo antes del cierre está almacenado en la memoria o 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

+0

¿De verdad está emitiendo varias llamadas a 'fp.write', o recogiendo todo en una gran cadena y escribiendo a la vez? Este último sería bastante ineficiente. –

+0

Llama a escritura múltiple en un bucle for. –

+0

muestra el código. si escribe las líneas una línea por una línea, no debería ser un problema. – ghostdog74

Respuesta

5

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

+2

Después de que la pregunta fue revisada, ahora está claro que '' something '* n' va a causar serios problemas de memoria cuando 'n' se agrande. La escritura de archivos no tiene nada que ver con la memoria agotadora '' algo '* n'. –

3

Habrá almacenamiento en búfer de escritura en el kernel de Linux, pero a (ir) intervalos regulares se descargarán al disco. Quedarse sin espacio en el búfer nunca debe causar un error de memoria en el nivel de la aplicación; los búferes deberían vaciarse antes de que eso ocurra, pausando la aplicación mientras lo hace.

1

Si escribe un archivo grande para el que las escrituras pueden fallar, es mejor que limpie el archivo en el disco a intervalos regulares usando fp.flush(). De esta manera el archivo estará en un lugar de su elección que se puede llegar fácilmente al 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 eliminará el archivo en disco cada 1000 líneas.

0

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

0

La escritura de archivos 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, entonces vería si está "perdiendo" referencias a objetos.
Algo así 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 recogiendo sólo un ejemplo, pero en su caso real de la fuga de referencia puede ser mucho más difícil de encontrar; sin embargo, este caso simplemente perderá memoria dentro de do_something debido a la forma en que Python maneja los parámetros predeterminados de las funciones.

2

Basándose en el comentario de ataylor a la pregunta: ¿

Es posible que desee nido de su bucle. Algo así como

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

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

+0

+1: Crear '" algo "* n' para valores grandes de' n' agotará la memoria. Escribir en un archivo usa muy poca memoria. –

Cuestiones relacionadas