【问题标题】:data.table vs bigmemory for read-only access to large objectsdata.table vs bigmemory 用于对大对象的只读访问
【发布时间】:2013-06-06 17:04:32
【问题描述】:

我有一个包含 2 个字符串和 6 个整数列的 1,000,000 行的大型 data.frame。顺序遍历这个 data.frame 需要花费大量时间,即使没有修改它。这是我正在使用的基本循环:

for( i in 1:1000000 ) {
  varA = mydf[i, "varA"]
  varB = mydf[i, "varB"]
  ...
}

处理 100 行大约需要 10 秒,我有几个 1M 的数据块要处理。我不需要修改 data.frame,但我确实需要按顺序读取行(这就是为什么我选择运行 for 循环而不是调用 apply)。

在这种情况下,您更愿意使用 data.table 还是 bigmemory 对象?

【问题讨论】:

  • 参见stackoverflow.com/questions/16882049/…,但请注意,您实际上不太可能需要这样做,更有可能是某种低效的算法
  • 你的意思是我的算法效率低下?顺序处理有什么问题?
  • 在 R 中通常有更好的、非顺序的和更快的方法,所以我建议发布您要解决的问题。
  • 你真的希望从那个模糊的描述中得到一些神奇的答案吗?
  • 严重需要更多信息... 1.5 年后,这个问题既没有被回答也没有被关闭。投票结束。

标签: r dataframe data.table


【解决方案1】:

使用data.table:

setDT(mydf)[, c('varA', 'varB')]

例如:

> mydf <- data.table(matrix(rnorm(1e8), nc = 100))# 1E6 rows
> colnames(mydf) <- paste0('var', 1:100)

使用 data.table 包

> head(mydf[, c('var50', 'var75')])

       var50      var75
1: 1.77199144  2.32235675
2: 0.06925491 -1.03333482
3: 0.05529698 -0.56474744
4: 0.07815707  0.06754285
5: 0.20430406 -2.31359882
6: 1.26963312 -1.18745481

机器时间:

> system.time(mydf[, c('var50', 'var75')])


user  system elapsed 
0.00    0.01    0.02

【讨论】:

    猜你喜欢
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多