zoukankan      html  css  js  c++  java
  • R 语言中 data table 的相关,内存高效的 增量式 data frame

    面对的是这样一个问题,不断读入一行一行数据,append到data frame上,如果用dataframe,  rbind() ,可以发现数据大的时候效率明显变低。

    原因是 每次bind 都是一次重新整个数据集的重新拷贝

    这个链接有人测试了各种方案,似乎给出了最优方案

    http://stackoverflow.com/questions/11486369/growing-a-data-frame-in-a-memory-efficient-manner

    library(data.table)
    dt <- data.table(x=rep(0,1000), y=rep(0,1000))
    tracemem(dt)
    for(i in 1:1000) {
      dt[i,x := runif(1)]
      dt[i,y := rnorm(1)]
    }

    data table 可以说是必备的r package。

    这也是我尝试多种方案后最终采用的办法。

    这里有介绍data.table 的具体用法

    http://cran.r-project.org/web/packages/data.table/data.table.pdf

    有个问题,赋值一行 难道用一定要用 dt[x, 1:100 := list(xx)] 这样?

    注意RHS 等号右侧一定要是一个List,不能是vector

    另外几个R 的技巧:

    • 时常运行下gc(), 回收内存(这就是为啥你workspace 没有object但内存仍然居高不下的原因)
    • 部分大的object,可以单独save(),需要的时候Load,不要最后存在image 里
    • r中的hash package 很好用
    • 并行我用的是 parallel包,简单易用
    • system.time(
      {
        x <- 1:wb2.userNum
        cl <- makeCluster(4, outfile='sim.log')
        clusterExport(cl, c("set_similarity","printf","wb2.follow2.set", "wb2.userNum"))
        results <- parLapply(cl, x, para_func_sim)
        print("results ok")
        wb2.follow.sim <- do.call('rbind', results)
        stopCluster(cl)
      })

      最后,多利用data table 的statistical 和apply系列函数,真的可以事半功倍!

  • 相关阅读:
    Lucene in action 笔记 case study
    关于Restful Web Service的一些理解
    Lucene in action 笔记 analysis篇
    Lucene in action 笔记 index篇
    Lucene in action 笔记 term vector
    Lucene in action 笔记 search篇
    博客园开博记录
    数论(算法概述)
    DIV, IFRAME, Select, Span标签入门
    记一个较困难的SharePoint性能问题的分析和解决
  • 原文地址:https://www.cnblogs.com/Sorean/p/4157398.html
Copyright © 2011-2022 走看看