2012-07-15 29 views
5

プロットをpdfに保存すると、プロットごとに一時ファイル(例:/tmp/RtmpFKQqjI/pdf317d27df81a0)が生成されます。多くのプロットをpdfに描画した後、私の/tmpパーティションのメモリが不足し、Rの動作が停止します(私のデスクトップもフリーズします)。pdf()によって作成された一時ファイルを削除する

リトルコード例:

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" 

(。pdf(file="Rplots%03d.pdf"); for (i in 1:10) { ... }; dev.off()ための同じ結果)

なぜRはdev.off()を呼び出した後、この一時ファイルを削除しないのですか?私は、各dev.off()後に次の行を追加します。回避策として

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

は、より良い方法はありますか?

+0

unlinkは、ファイルが開いていない場合にのみスペースを解放します。彼らは閉じていると確信していますか?あなたのシステムにlsofがありますか? – stark

+0

IMHOファイルは閉じられています( 'dev.off()'の呼び出し後)。 'lsof | grep "/ tmp/Rtmp */pdf *" 'は何も返しません(' $?== 1')。リンク解除の回避策が機能します(メモリは後で解放されます)。 – sgibb

答えて

4

これは、Rのpdfデバイスの実装における(マイナーな)バグである@starkに同意する傾向があります。

代わりに、cairo_pdfデバイスを使用してください。このデバイスは基本的に同一のpdfsを生成しますが、余分なファイルは一時ディレクトリに置かれません。

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

あなたの追加の回避策をありがとう。それぞれのplot文の後に 'unlink(...)'を呼び出すよりも優れています。 – sgibb

3

dev.offが呼び出された後にファイルが閉じられるので、これはR's pdfライブラリのバグです。最良の解決策はバグを修正することです。 pdfがtmpファイルを残す理由はありません。

+0

私はバグレポートを書いた:[Bug 14991](https://bugs.r-project.org/bugzilla3/show_bug.cgi?id=14991) – sgibb

関連する問題