
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開(kāi)始菜單運(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 開(kāi)發(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ù)庫(kù)做整體處理
colSums(iris[,1:4])
利用R內(nèi)置的向量化函數(shù),自定義向量化函數(shù),只要在函數(shù)定義時(shí)每個(gè)運(yùn)算是向量化的。但是在函數(shù)定義時(shí)用了邏輯判斷語(yǔ)句,就會(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語(yǔ)句,不能接受向量作為判斷的條件,否則判斷第一個(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為解釋性語(yǔ)言,也是動(dòng)態(tài)語(yǔ)言,如果不事先指定對(duì)象的類型和長(zhǎng)度,在運(yùn)算過(guò)程會(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)返回歷史占用過(guò)的最大內(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,你無(wú)法在一個(gè)程序上使用超過(guò)4G (數(shù)位上限)。這種時(shí)候,可以考慮使用64位的版本。
數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼
若不方便掃碼,搜微信號(hào):CDAshujufenxi
CDA 數(shù)據(jù)分析師報(bào)考條件詳解與準(zhǔn)備指南? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代浪潮下,CDA 數(shù)據(jù)分析師認(rèn)證愈發(fā)受到矚目,成為眾多有志投身數(shù) ...
2025-07-18剛?cè)肼殘?chǎng)或是在職場(chǎng)正面臨崗位替代、技能更新、人機(jī)協(xié)作等焦慮的打工人,想要找到一條破解職場(chǎng)焦慮和升職瓶頸的系統(tǒng)化學(xué)習(xí)提升 ...
2025-07-182025被稱為“AI元年”,而AI,與數(shù)據(jù)密不可分。網(wǎng)易公司創(chuàng)始人丁磊在《AI思維:從數(shù)據(jù)中創(chuàng)造價(jià)值的煉金術(shù) ...
2025-07-18CDA 數(shù)據(jù)分析師:數(shù)據(jù)時(shí)代的價(jià)值挖掘者 在大數(shù)據(jù)席卷全球的今天,數(shù)據(jù)已成為企業(yè)核心競(jìng)爭(zhēng)力的重要組成部分。從海量數(shù)據(jù)中提取有 ...
2025-07-18SPSS 賦值后數(shù)據(jù)不顯示?原因排查與解決指南? 在 SPSS( Statistical Package for the Social Sciences)數(shù)據(jù)分析過(guò)程中,變量 ...
2025-07-18在 DBeaver 中利用 MySQL 實(shí)現(xiàn)表數(shù)據(jù)同步操作指南? ? 在數(shù)據(jù)庫(kù)管理工作中,將一張表的數(shù)據(jù)同步到另一張表是常見(jiàn)需求,這有助于 ...
2025-07-18數(shù)據(jù)分析師的技能圖譜:從數(shù)據(jù)到價(jià)值的橋梁? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代,數(shù)據(jù)分析師如同 “數(shù)據(jù)翻譯官”,將冰冷的數(shù)字轉(zhuǎn)化為清晰的 ...
2025-07-17Pandas 寫(xiě)入指定行數(shù)據(jù):數(shù)據(jù)精細(xì)化管理的核心技能? 在數(shù)據(jù)處理的日常工作中,我們常常需要面對(duì)這樣的場(chǎng)景:在龐大的數(shù)據(jù)集里精 ...
2025-07-17解碼 CDA:數(shù)據(jù)時(shí)代的通行證? 在數(shù)字化浪潮席卷全球的今天,當(dāng)企業(yè)決策者盯著屏幕上跳動(dòng)的數(shù)據(jù)曲線尋找增長(zhǎng)密碼,當(dāng)科研人員在 ...
2025-07-17CDA 精益業(yè)務(wù)數(shù)據(jù)分析:數(shù)據(jù)驅(qū)動(dòng)業(yè)務(wù)增長(zhǎng)的實(shí)戰(zhàn)方法論 在企業(yè)數(shù)字化轉(zhuǎn)型的浪潮中,“數(shù)據(jù)分析” 已從 “加分項(xiàng)” 成為 “必修課 ...
2025-07-16MySQL 中 ADD KEY 與 ADD INDEX 詳解:用法、差異與優(yōu)化實(shí)踐 在 MySQL 數(shù)據(jù)庫(kù)表結(jié)構(gòu)設(shè)計(jì)中,索引是提升查詢性能的核心手段。無(wú)論 ...
2025-07-16解析 MySQL Update 語(yǔ)句中 “query end” 狀態(tài):含義、成因與優(yōu)化指南? 在 MySQL 數(shù)據(jù)庫(kù)的日常運(yùn)維與開(kāi)發(fā)中,開(kāi)發(fā)者和 DBA 常會(huì) ...
2025-07-16如何考取數(shù)據(jù)分析師證書(shū):以 CDA 為例? ? 在數(shù)字化浪潮席卷各行各業(yè)的當(dāng)下,數(shù)據(jù)分析師已然成為企業(yè)挖掘數(shù)據(jù)價(jià)值、驅(qū)動(dòng)決策的 ...
2025-07-15CDA 精益業(yè)務(wù)數(shù)據(jù)分析:驅(qū)動(dòng)企業(yè)高效決策的核心引擎? 在數(shù)字經(jīng)濟(jì)時(shí)代,企業(yè)面臨著前所未有的數(shù)據(jù)洪流,如何從海量數(shù)據(jù)中提取有 ...
2025-07-15MySQL 無(wú)外鍵關(guān)聯(lián)表的 JOIN 實(shí)戰(zhàn):數(shù)據(jù)整合的靈活之道? 在 MySQL 數(shù)據(jù)庫(kù)的日常操作中,我們經(jīng)常會(huì)遇到需要整合多張表數(shù)據(jù)的場(chǎng)景 ...
2025-07-15Python Pandas:數(shù)據(jù)科學(xué)的瑞士軍刀? ? 在數(shù)據(jù)驅(qū)動(dòng)的時(shí)代,面對(duì)海量、復(fù)雜的數(shù)據(jù),如何高效地進(jìn)行處理、分析和挖掘成為關(guān)鍵。 ...
2025-07-15用 SQL 生成逆向回滾 SQL:數(shù)據(jù)操作的 “后悔藥” 指南? 在數(shù)據(jù)庫(kù)操作中,誤刪數(shù)據(jù)、錯(cuò)改字段或誤執(zhí)行批量更新等問(wèn)題時(shí)有發(fā)生。 ...
2025-07-14t檢驗(yàn)與Wilcoxon檢驗(yàn)的選擇:何時(shí)用t.test,何時(shí)用wilcox.test? t 檢驗(yàn)與 Wilcoxon 檢驗(yàn)的選擇:何時(shí)用 t.test,何時(shí)用 wilcox. ...
2025-07-14AI 浪潮下的生存與進(jìn)階: CDA數(shù)據(jù)分析師—開(kāi)啟新時(shí)代職業(yè)生涯的鑰匙(深度研究報(bào)告、發(fā)展指導(dǎo)白皮書(shū)) 發(fā)布機(jī)構(gòu):CDA數(shù)據(jù)科 ...
2025-07-13LSTM 模型輸入長(zhǎng)度選擇技巧:提升序列建模效能的關(guān)鍵? 在循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)家族中,長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM)憑借其解決長(zhǎng)序列 ...
2025-07-11