在 R 中清除記憶體

Gustavo du Mortier 2021年2月7日
在 R 中清除記憶體

在使用 R 指令碼一段時間後,R 環境可能會存留大量的記憶體資料,從而佔用計算機的大量資源。這種情況最終可能會導致 R 系統因為無法再分配記憶體而拒絕執行程式碼。即使重啟 R 環境,也可能發生記憶體沒有被釋放出來的情況。

命令 rm(list=ls()) 預計會釋放所有物件使用的記憶體,但它真正做的是銷燬使用的記憶體塊的指標。問題是這些記憶體塊並沒有立即釋放出來供新任務使用。

在 R 中使用 gc 函式清除記憶體

垃圾回收過程會在 R 中自動定期執行,但有時當你需要大量記憶體來進行一些大資料操作時,垃圾回收過程並沒有在準確的時刻執行。在這種情況下,呼叫 gc() 函式來清除 R 中的記憶體可能會很有用。

gc() 的主要目的是顯示一份關於記憶體使用情況的報告。副作用是,呼叫 gc() 會觸發垃圾回收過程,清除記憶體。因此,正如 gc 文件所指出的那樣,在刪除一個大物件後呼叫 gc() 是個好主意,因為這個操作會提示 R 釋放它不再使用的記憶體。

你也可以在一個迴圈中插入對 gc() 的呼叫來重複執行垃圾回收過程。只是要考慮到這個過程每次呼叫都需要一些時間,大約是 100ms,所以不建議把它放在一個高度重複的迴圈或者迭代次數多的迴圈中。

如果使用的是 Windows,可以呼叫 memory.size() 函式,用 max=T 引數來顯示作業系統可訪問的記憶體量,或者用 max=F 來顯示任何時刻使用的記憶體量。R 文件解釋了 memory.size() 函式的其他方面。

為了顯示建立和銷燬大資料物件時的記憶體消耗是如何變化的,我們可以在 Windows 中執行以下程式碼,建立一個具有 100,000 個元素的樣本向量,刪除向量,最後執行垃圾回收。在每條指令之間,我們可以通過執行 memory.size 函式,並使用 max=F 引數來檢查使用了多少記憶體。

memory.size (max = F)

輸出:

[1] 32.6

這 32.6MB 代表了 R 使用的最小記憶體量。

my_data <- sample (1:100000)
memory.size (max = F)

輸出:

[1] 33.75

我們可以看到,由於 memory.size 函式報告的使用記憶體增加了 1,所以建立的樣本資料大約消耗了 1 MB 的記憶體。

rm (my_data)
memory.size (max = F)

輸出:

[1] 33.75

儘管我們刪除了物件,但記憶體似乎仍然被佔用。

gc()

輸出:

         used (Mb) gc trigger  (Mb)  max used  (Mb)
Ncells 315785 16.9     617200  33.0    617200  33.0
Vcells 633077  4.9   25730861 196.4 110503932 843.1
memory.size (max = F)

輸出:

[1] 32.6

每臺電腦的記憶體量都不一樣,但你可以看到,在執行 rm (my_data) 指令後,memory.size 報告的空閒記憶體量保持不變,只有在執行 gc() 指令後,它才返回到 32.6 MB 的初始值,記憶體被有效釋放。