在 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 的初始值,記憶體被有效釋放。