【问题标题】:R: running out of memory using `strsplit`R:使用`strsplit`耗尽内存
【发布时间】:2013-07-13 16:03:58
【问题描述】:

我使用strsplit 的内存不足(大概);这是代码:

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 Ncells 列尚未返回给操作系统。

我不太关心操作系统没有取回 RAM,我关心的是什么 是为了处理 80M 的数据 R 分配了 1.6G(在我的真实数据上 用完可用的物理 RAM)

有没有办法提高内存效率?

例如,可能将字符向量转换为因子并对其进行操作 它的水平会有所帮助吗?

R version 3.0.1 (2013-05-16) -- "Good Sport"
Platform: x86_64-pc-linux-gnu (64-bit)

【问题讨论】:

    标签: r memory-management


    【解决方案1】:

    使用substr 和regexpr 怎么样:

    x <- c("Chrome@28","Chrome@27","Firefox@21","IE@8")
    substr(x,1,regexpr("@",x)-1)
    [1] "Chrome"  "Chrome"  "Firefox" "IE" 
    

    【讨论】:

    • 这似乎比eddi的快。
    【解决方案2】:

    @James 说的,甚至更简单:

    x <- c("Chrome@28","Chrome@27","Firefox@21","IE@8")
    sub('@.*', '', x)
    #[1] "Chrome"  "Chrome"  "Firefox" "IE"  
    

    【讨论】:

      猜你喜欢
      • 2017-05-16
      • 1970-01-01
      • 1970-01-01
      • 2013-07-22
      • 2021-02-24
      • 1970-01-01
      • 2015-08-23
      • 2012-11-10
      • 2012-08-19
      相关资源
      最近更新 更多