2012-07-15 12 views
5

Cuando se almacenan parcelas en un pdf, R genera un archivo temporal (por ejemplo, /tmp/RtmpFKQqjI/pdf317d27df81a0) para cada parcela. Después de dibujar muchos gráficos en un pdf, mi partición /tmp se queda sin memoria y R deja de funcionar (mi escritorio también se congela).Eliminación de archivos temporales creados por pdf()

pequeño ejemplo de código:

for (i in 1:10) { 
    pdf(file=paste(i, ".pdf", sep="")) 
    plot(1:10) 
    dev.off() 
} 

list.files(path=tempdir(), pattern="^pdf.", full.names=TRUE) 
# [1] "/tmp/RtmpFKQqjI/pdf317d27df81a0" "/tmp/RtmpFKQqjI/pdf317d28ed0612" 
# [3] "/tmp/RtmpFKQqjI/pdf317d295c2453" "/tmp/RtmpFKQqjI/pdf317d304bb025" 
# [5] "/tmp/RtmpFKQqjI/pdf317d3332d7fe" "/tmp/RtmpFKQqjI/pdf317d3921428f" 
# [7] "/tmp/RtmpFKQqjI/pdf317d4cf812ca" "/tmp/RtmpFKQqjI/pdf317d5082bebe" 
# [9] "/tmp/RtmpFKQqjI/pdf317d560d326" "/tmp/RtmpFKQqjI/pdf317d674b25ea" 

(. Los mismos resultados para pdf(file="Rplots%03d.pdf"); for (i in 1:10) { ... }; dev.off())

¿Por qué no eliminar esta R archivos temporales después de llamar dev.off()?

Como solución añado la siguiente línea después de cada dev.off():

unlink(list.files(path=tempdir(), pattern="^pdf.", full.names=TRUE)) 

¿Hay una mejor manera?

+0

unlink solo libera el espacio si nada tiene el archivo abierto. ¿Estás seguro de que están cerrados? ¿Tienes lsof en tu sistema? – stark

+0

En mi humilde opinión los archivos están cerrados (definitivamente después de llamar a 'dev.off()'). 'lsof | grep "/ tmp/Rtmp */pdf *" 'no devuelve nada (' $? == 1'). La solución de desvinculación funciona (la memoria es gratuita después). – sgibb

Respuesta

4

Tiendo a estar de acuerdo con @stark en que este es un error (menor) en la implementación del dispositivo R's pdf.

Una solución alternativa es utilizar el dispositivo cairo_pdf, que produce archivos pdfs esencialmente idénticos pero no deja archivos extra en el directorio temporal.

for (i in 1:2) { 
    cairo_pdf(file=paste(i, ".pdf", sep="")) 
    plot(1:10) 
    dev.off() 
} 
list.files(path=tempdir(), pattern="^pdf.", full.names=TRUE) 
# character(0) 
+0

Gracias por su solución adicional. Es mejor que invocar 'unlink (...)' después de cada declaración de argumento. – sgibb

3

Dado que el archivo se cierra después de invocar dev.off, esto es un error en la biblioteca de R's pdf. La mejor solución es solucionar el error. No hay ninguna razón para que el pdf deje archivos tmp.

+0

Escribí un informe de error: [Error 14991] (https://bugs.r-project.org/bugzilla3/show_bug.cgi?id=14991) – sgibb

Cuestiones relacionadas