首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R:使用“`strsplit`”内存不足

R:使用“`strsplit`”内存不足
EN

Stack Overflow用户
提问于 2013-07-15 17:29:29
回答 2查看 541关注 0票数 2

我使用strsplit (大概)耗尽了内存;下面是代码:

代码语言:javascript
复制
split.fields <- function (frame, fields, split, suffix, ...) {
  for (field in fields) {
    v <- sapply(strsplit(frame[[field]],"@",...),"[",1)
    frame[[paste0(field,suffix)]] <- frame[[field]]
    frame[[field]] <- v
  }
  frame
}
split.version <- function (frame, fields)
  split.fields(frame, fields, split="@", suffix="Ver", fixed=TRUE)
> gc()
         used (Mb) gc trigger (Mb) max used (Mb)
Ncells 238165 12.8     467875   25   407500 21.8
Vcells 369492  2.9     905753    7   905631  7.0
> frame <- data.frame(browser = sample(c("Chrome@28","Chrome@27","Firefox@21","Firefox@22","IE@9","IE@8"), 1e7, replace=TRUE), stringsAsFactors=FALSE)
> str(frame)
'data.frame':   10000000 obs. of  1 variable:
 $ browser: chr  "IE@8" "Chrome@27" "Chrome@27" "Chrome@27" ...
> object.size(frame)
80000992 bytes
> gc()
           used (Mb) gc trigger  (Mb) max used  (Mb)
Ncells   240555 12.9     467875  25.0   407500  21.8
Vcells 10373979 79.2   34109873 260.3 40534688 309.3
> system.time(frame <- split.version(frame,"browser"))
   user  system elapsed 
 73.700   0.872  74.831 
> object.size(frame)
160001248 bytes
> str(frame)
'data.frame':   10000000 obs. of  2 variables:
 $ browser   : chr  "IE" "Chrome" "Chrome" "Chrome" ...
 $ browserVer: chr  "IE@8" "Chrome@27" "Chrome@27" "Chrome@27" ...
> gc()
           used  (Mb) gc trigger  (Mb)  max used   (Mb)
Ncells   264888  14.2   16652260 889.4  31376740 1675.7
Vcells 20459856 156.1   95461025 728.4 119226749  909.7

除了R进程的RSS现在是1.6G之外,所有这些看起来都比较合理。

这似乎意味着max used列中的1675.7Mb Ncell未返回到操作系统。

我不在乎操作系统没有收回内存,我关心的是处理分配给1.6G的8000万个数据(在我的真实数据上,它耗尽了可用的物理RAM )。

有什么方法可以提高内存的效率吗?

例如,也许将字符向量转换为一个因子并在其水平上操作会有帮助吗?

代码语言:javascript
复制
R version 3.0.1 (2013-05-16) -- "Good Sport"
Platform: x86_64-pc-linux-gnu (64-bit)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-15 17:38:35

使用substrregexpr怎么样?

代码语言:javascript
复制
x <- c("Chrome@28","Chrome@27","Firefox@21","IE@8")
substr(x,1,regexpr("@",x)-1)
[1] "Chrome"  "Chrome"  "Firefox" "IE" 
票数 4
EN

Stack Overflow用户

发布于 2013-07-15 17:42:04

詹姆斯说了些什么,甚至更简单:

代码语言:javascript
复制
x <- c("Chrome@28","Chrome@27","Firefox@21","IE@8")
sub('@.*', '', x)
#[1] "Chrome"  "Chrome"  "Firefox" "IE"  
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17660202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档