
R內(nèi)存管理與垃圾清理
1.內(nèi)存查看
memory.limit():查看內(nèi)存大小
memory.limit(n):申請(qǐng)內(nèi)存大小
memory.size(NA):查看內(nèi)存大小
memory.size(T):查看已分配的內(nèi)存
memory.size(F):查看已使用的內(nèi)存
2.內(nèi)存申請(qǐng)
在Windows開始菜單運(yùn)行:
Rgui -max-mem-size 8GB
與在R GUI中執(zhí)行:
memory.limit(8000)
都能申請(qǐng)8GB使用內(nèi)存
3.垃圾清除
rm(x):從workplace中刪除變量/文件x
gc():清除內(nèi)存垃圾
rm(list=ls()):清除workplace中所有變量
4.提升R的性能和突破內(nèi)存限制的技巧
4.1性能提升的方法
4.1.1 系統(tǒng)升級(jí)
升級(jí)硬件
使用64位操作系統(tǒng)
利用GPU
租用云計(jì)算服務(wù)器
4.1.2 開發(fā)層面的優(yōu)化
算法降低算法復(fù)雜度
調(diào)用C/C++或者Fortran關(guān)鍵的、耗時(shí)的計(jì)算步驟
緩沖技術(shù)減少重復(fù)計(jì)算
4.1.3 使用層面的優(yōu)化
充分利用R的內(nèi)存機(jī)制——R的基礎(chǔ)優(yōu)化
增強(qiáng)R的矩陣運(yùn)算——加速BLAS
并行計(jì)算
大規(guī)模數(shù)據(jù)的處理——圖片內(nèi)存限制
使用Revolution R Enterprise(RRE)
4.2 充分利用R的內(nèi)部機(jī)制優(yōu)化性能
4.2.1向量化
向量化的代碼,不要用循環(huán)!
利用矩陣運(yùn)算
利用內(nèi)置的向量化函數(shù),比如exp、sin、rowMeans、rowSums、colSums、ifelse等
利用Vectorize函數(shù)將非向量化的函數(shù)改裝為向量化的函數(shù)
*apply函數(shù)族:apply、lapply、sapply、tapply、mapply等
plyr和dplyr包Rstudio發(fā)布的data wrangling cheat sheet
##利用矩陣運(yùn)算
n <- 100000
x1 <- 1:n
x2 <- 1:n
y <- vector()
system.time(
for(i in 1:n){y[i] <- x1[i] + x2[i]}
)
system.time(y <- x1 + x2)
## 利用向量化運(yùn)算
## 內(nèi)置的向量化函數(shù)
v <- 1:100000
result <- rep(1:100000)
system.time(
for(i in 1:100000){result[i] <- sin(v[i])}
)
system.time(result <- sin(v))
## 利用rowMeans、rowSums、colSums、colMeans等函數(shù)對(duì)矩陣或數(shù)據(jù)庫做整體處理
colSums(iris[,1:4])
利用R內(nèi)置的向量化函數(shù),自定義向量化函數(shù),只要在函數(shù)定義時(shí)每個(gè)運(yùn)算是向量化的。但是在函數(shù)定義時(shí)用了邏輯判斷語句,就會(huì)破壞的向量化特征。
func <- function(x){
if(x %% 2 == 0){
ret <- TRUE
}else{
ret <- FALSE}
return(ret)
}
func(34)
func(c(1,2,3,4))
## Warning message:
## In if (x%%2 == 0) { :
## the condition has length > 1 and only the first element will be used
## 在函數(shù)的定義中有if語句,不能接受向量作為判斷的條件,否則判斷第一個(gè)元素。
## 利用ifelse函數(shù)做向量化的判斷
myfunc <- function(x){
ifelse(x %% 2 == 0,TRUE,FALSE)
}
myfunc(c(1,2,3,4))
##利用Vectorize函數(shù)將非向量化的函數(shù)改裝為向量化的函數(shù)
funcv <- Vectorize(func)
funcv(c(1,2,3,4))
##利用sapply函數(shù)向量化運(yùn)算
sapply(c(1,2,3,4),func)
4.2.2預(yù)先給對(duì)象分配內(nèi)存
R為解釋性語言,也是動(dòng)態(tài)語言,如果不事先指定對(duì)象的類型和長(zhǎng)度,在運(yùn)算過程會(huì)動(dòng)態(tài)分配內(nèi)存,提高靈活性,但降低了效率。
盡量減少cbind、rbind的使用
## 求出10000個(gè)斐波那契數(shù)
x <- c(1,1)
i <- 2
system.time(
while(i<10000){
new <- x[i] + x[i-1]
x <- cbind(x,new)
i <- i + 1
}
)
## 指定類型和長(zhǎng)度
x <- vector(mode="numeric",100000)
x[1] <- 1
x[2] <- 1
system.time(
while(i<10000){
i <- i + 1
x[i] <- x[i-1] + x[i-2]
}
)
4.2.3避免內(nèi)存拷貝
假設(shè)我們有許多彼此不相關(guān)的向量,但因?yàn)橐恍┢渌脑?,我們希望將每個(gè)向量的第三個(gè)元素設(shè)為8,既然它們是互不相關(guān)的,甚至可能具有不同的長(zhǎng)度,我們也許會(huì)考慮將它們放在一個(gè)列表中:
m <- 5000
n <- 1000
z <- list()
for(i in 1:m) z[[i]] <- sample(1:10, n, replace = T)
system.time(for(i in 1:m) z[[i]][3] <- 8)
## 把這些向量一起放到矩陣中
z <- matrix(sample(1:10, m * n, replace = T),nrow = m)
system.time(z[,3] <- 8)
4.2.4刪除臨時(shí)對(duì)象和不再用的對(duì)象
rm()刪除對(duì)象
rm(object)刪除指定對(duì)象,rm(list = ls())可以刪除內(nèi)存中的所有對(duì)象
gc()內(nèi)存垃圾回收
使用rm(object)刪除變量,要使用gc()做垃圾回收,否則內(nèi)存是不會(huì)自動(dòng)釋放的。invisible(gc())不顯示垃圾回收的結(jié)果
4.2.5分析內(nèi)存的函數(shù)
ls()列出特定環(huán)境中的對(duì)象
object.size()返回R對(duì)象的大?。ń频模?br />
memory.profile()分析cons單元的使用情況
memory.size()監(jiān)測(cè)全部?jī)?nèi)存的使用情況(僅Windows下可用)
memory.size(max=T)返回歷史占用過的最大內(nèi)存;memory.size(max=F)返回目前占用的內(nèi)存。未做垃圾清理時(shí),已使用內(nèi)存和已分配內(nèi)存同步增加,但在垃圾清理后rm(list=ls());gc(),已使用內(nèi)存會(huì)減少,而已分配給R的內(nèi)存不會(huì)改變。
memory.limit()系統(tǒng)可分配的內(nèi)存上限(僅Windows下可用)
memory.limit(newLimit)更改到一個(gè)新的上限。 注意,在32位的R中,封頂上限為4G,你無法在一個(gè)程序上使用超過4G (數(shù)位上限)。這種時(shí)候,可以考慮使用64位的版本。
數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼
若不方便掃碼,搜微信號(hào):CDAshujufenxi
訓(xùn)練與驗(yàn)證損失驟升:機(jī)器學(xué)習(xí)訓(xùn)練中的異常診斷與解決方案 在機(jī)器學(xué)習(xí)模型訓(xùn)練過程中,“損失曲線” 是反映模型學(xué)習(xí)狀態(tài)的核心指 ...
2025-09-19解析 DataHub 與 Kafka:數(shù)據(jù)生態(tài)中兩類核心工具的差異與協(xié)同 在數(shù)字化轉(zhuǎn)型加速的今天,企業(yè)對(duì)數(shù)據(jù)的需求已從 “存儲(chǔ)” 轉(zhuǎn)向 “ ...
2025-09-19CDA 數(shù)據(jù)分析師:讓統(tǒng)計(jì)基本概念成為業(yè)務(wù)決策的底層邏輯 統(tǒng)計(jì)基本概念是商業(yè)數(shù)據(jù)分析的 “基礎(chǔ)語言”—— 從描述數(shù)據(jù)分布的 “均 ...
2025-09-19CDA 數(shù)據(jù)分析師:表結(jié)構(gòu)數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結(jié)構(gòu)數(shù)據(jù)(如數(shù)據(jù)庫表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-19SQL Server 中 CONVERT 函數(shù)的日期轉(zhuǎn)換:從基礎(chǔ)用法到實(shí)戰(zhàn)優(yōu)化 在 SQL Server 的數(shù)據(jù)處理中,日期格式轉(zhuǎn)換是高頻需求 —— 無論 ...
2025-09-18MySQL 大表拆分與關(guān)聯(lián)查詢效率:打破 “拆分必慢” 的認(rèn)知誤區(qū) 在 MySQL 數(shù)據(jù)庫管理中,“大表” 始終是性能優(yōu)化繞不開的話題。 ...
2025-09-18DSGE 模型中的 Et:理性預(yù)期算子的內(nèi)涵、作用與應(yīng)用解析 動(dòng)態(tài)隨機(jī)一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價(jià)值的專業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫表、Excel 表、 ...
2025-09-17Excel 導(dǎo)入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實(shí)戰(zhàn)應(yīng)用 在用 Python(如 pandas 庫)處理 Excel 數(shù)據(jù)時(shí),“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗(yàn)與 t 檢驗(yàn):差異、適用場(chǎng)景與實(shí)踐應(yīng)用 在數(shù)據(jù)分析與統(tǒng)計(jì)學(xué)領(lǐng)域,假設(shè)檢驗(yàn)是驗(yàn)證研究假設(shè)、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專業(yè)操盤手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計(jì)劃中 rows 數(shù)量的準(zhǔn)確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計(jì)劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對(duì)象的 text 與 content:區(qū)別、場(chǎng)景與實(shí)踐指南 在 Python 進(jìn)行 HTTP 網(wǎng)絡(luò)請(qǐng)求開發(fā)時(shí)(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價(jià)值的核心操盤手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫表)是企業(yè)最基礎(chǔ)、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請(qǐng)求工具對(duì)比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請(qǐng)求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長(zhǎng)浮點(diǎn)數(shù)據(jù)的科學(xué)計(jì)數(shù)法問題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長(zhǎng)浮點(diǎn)數(shù)據(jù)時(shí)的科學(xué)計(jì)數(shù)法問題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務(wù)數(shù)據(jù)分析步驟的落地者與價(jià)值優(yōu)化者 業(yè)務(wù)數(shù)據(jù)分析是企業(yè)解決日常運(yùn)營(yíng)問題、提升執(zhí)行效率的核心手段,其價(jià)值 ...
2025-09-12用 SQL 驗(yàn)證業(yè)務(wù)邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實(shí)戰(zhàn)指南 在業(yè)務(wù)系統(tǒng)落地過程中,“業(yè)務(wù)邏輯” 是連接 “需求設(shè)計(jì)” 與 “用戶體驗(yàn) ...
2025-09-11塔吉特百貨孕婦營(yíng)銷案例:數(shù)據(jù)驅(qū)動(dòng)下的精準(zhǔn)零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當(dāng)下,精準(zhǔn)營(yíng)銷成為企業(yè)突圍的核心方 ...
2025-09-11