:::

資料分析到沒硬碟空間了?設定R的暫存目錄 / How to Change Directory for Temporary Files in R

image

最近用R在跑循序樣式勘探的時候,赫然發現程式居然跑到讓整台電腦都當機。仔細檢查之後才發現,原來R在分析的時候會用到大量的暫存空間,而這個暫存空間預設會擺在系統磁碟機當中。要如何將R的暫存目錄設到其他地方呢?網路上有不同的說法,最後我終於找到了一個解決方案,所以撰寫這篇作為記錄。


建立暫存目錄的配置檔 / Setup configuration for temporary files' directoy

image

請在R執行以下指令:

write("TMPDIR = 'D:\\tmp'", file=file.path(Sys.getenv('R_USER'), '.Renviron'))

紅字的「D:\\tmp」是你想要指定暫存目錄的路徑,它會在家目錄底下寫入名為「.Renviron」的檔案中。

image

接著你的工作目錄底下就會出現「.Renviron」。

為了讓「.Renviron」的設定生效,我們需要完全關閉R再重新啟動,或著你也可以用下面的方法。

image

RStudio有提供立即重新啟動R的功能,位於Session > Restart R中。執行Resrtart R後會出現「Restarting R session…」,執行完成之後修改暫存目錄的路徑就會生效。

image

我們可以試著用tempdir()指令來看看現在的暫存目錄,果然換成我們設定的「D:\\tmp」了。

2017-06-27_215902

在進行循序樣式探勘的時候,R會選擇用我們指定的暫存目錄路徑來擺放暫存檔。這樣就可以用更大的空間來分析檔案囉。


小結 / In closing

最後我們來談談網路上的其他做法。

有些做法主張修改tempdir()指令的內容,但這樣的做法並不會影響tempfile()指令,也不會影響到函式庫的運作,失敗。

Darren Norris有講到要在家目錄加入Renviron.site檔案,檔案內容就是設定暫存目錄的變數。不過到底要放在那個目錄才對,這就比較難確定。

StackOverflow中Matthew Plourde回答用R指令的write()跟用Sys.getenv('R_USER')來取得家目錄位置,並建立比Renviron.site優先度還要低一點的.Renviron,這是正確的方向,但是他設定的變數卻是TMP。根據Miguel Vazq的補充,在Windows環境中,要用TMPDIR來取代TMP,這就是最後的正解。

image

其實我們也可以把.Renviron建立在現在的工作目錄(workspace)中。但是這樣只有在這個工作目錄底下.Renviron才能發揮作用。而建立在家目錄的.Renviron的話,這個家目錄的使用者啟動R的時候都會生效。

因為修改暫存目錄的方法實在是各說紛紜,光這個小問題就花了我3個小時的時間研究,R實在是令人困擾啊。附帶一提,我一邊撰寫這篇一邊分析資料,暫存檔的檔案大小已經超過7GB了,實在是很佔空間啊。

總共5 則留言 ( 我要發問 , 隱藏留言 顯示留言 )

  1. 結果跑了一個晚上,暫存檔已經超過160GB,又要把我另一個硬碟空間吃完
    看來得要換個演算法了orz

    回覆刪除
  2. 布丁您好,請問這篇目前還是適用嗎?近日用R跑分析,跑完都直接當掉,暫存在記憶體的資料過大,請問若用此篇的方法,未來R的暫存檔都不用RAM嗎? 未來讀取在硬碟的暫存檔速度會較暫存檔存在RAM時慢嗎? 謝謝您

    回覆刪除
    回覆
    1. 您好,

      1. 改完後R的暫存檔都不用RAM嗎?

      答案是「不一定」。

      許多演算法都需要暫存區,但這些暫存區可能不見得會乖乖使用R給的暫存區路徑指令tempdir(),可能還是選擇寫在記憶體、或是硬碟的某處。
      要看演算法的內容才能確定。
      不過你可以改改看。如果跑演算法的時候,暫存資料夾內有出現檔案,那就表示這樣改是可以用的。

      然後,跑R程式語言一定會用到RAM。
      最常見的是變數過多、變數裡面的資料量過大,演算法又沒有打算把它寫入到暫存檔的話,那就會持續佔用更多的RAM。
      一樣,這就是演算法的問題,必須改進演算法才行。

      2. 硬碟的暫存速度會比存在RAM時慢嗎?

      是。

      一個是把RAM塞爆跑不完結果,一個是放硬碟跑慢一點,但能夠把結果呈現出來。
      要選那個選項,應該不用多說了吧?

      補充3. 要怎麼把硬碟當RAM使用?

      就算RAM很便宜,主機板擴充容量還是有限制。
      這時候可以考慮把硬碟當RAM使用的方案:SWAP虛擬記憶體。

      https://www.wongwonggoods.com/linux/linux_useful_command/linux-swap/
      這是Linux的功能,可以讓硬碟一塊分區變成記憶體系統中的一部份,讓本來無法執行的R腳本變得可以執行。
      證詞:https://stackoverflow.com/a/49591388

      我知道很多人不知道怎麼使用Linux,它也的確有些門檻。
      但既然你都要處理R會跑到當機的問題,表示你在處理的是更專門的分析。
      更專門的分析需要配得起它的作業系統。毋庸置疑,那就是Linux。

      藉這個機會來接觸Linux,也是一個不錯的契機呀。
      加油。

      附帶一提,我在一臺Windows筆電上拿USB灌了Linux的Kubuntu雙系統,從此對Windows使用者產生了敬意:「為什麼大家可以忍受這種又慢又不順手的環境?」
      這可能就是臺灣人刻苦耐勞的美德吧。

      刪除
    2. 謝謝布丁用心的回答,很有收穫,我來研究看看,感恩!

      刪除