R - 尽快初始化数据帧

时间:2016-09-25 05:00:20

标签: r

我正在尝试逐步提高我正在处理的项目的速度。该项目目前需要初始化一个数据帧,其中包含10M-1B行和24列之间的任何位置,以启动项目。前8列是字符串,接下来的16列是整数,因此它必须是数据帧而不是矩阵。

目前我有:

starttime = Sys.time()
total_num_lineups = 100000000
lineup = as.data.frame(matrix(nrow = total_num_lineups, ncol = 24))

Sys.time() - starttime
# Time difference of 44.70181 secs

对于100M行大约需要45秒。该项目可以很好地扩展到超过1B行,这是我试图解决的第一个瓶颈。任何关于如何加快这一步骤的想法将不胜感激。

额外 - 如果需要,我可以提供有关项目的其他信息,但是考虑按问题集中问题可能会更好。如果容器更快,我愿意将容器(转换为数据表或其他结构)切换。

谢谢!

1 个答案:

答案 0 :(得分:3)

当涉及这个大小的东西时,data.table包是要走的路。

下面的代码初始化了data.frame,但只有1行,将其转换为data.table,然后将第一行重复到给定的维度。

library(data.table)

starttime = Sys.time()
total_num_lineups = 100000000
lineup = as.data.frame(matrix(nrow = 1, ncol = 24))
dt = as.data.table(lineup)
testit = dt[rep(1,total_num_lineups)]

Sys.time() - starttime
# Time difference of 15.08011 secs

请注意,初始化data.frame的方式会使所有列都加倍,而不是您想要的字符/整数。要获取所需的列类型,可以使用以下命令:

library(data.table)

starttime = Sys.time()
total_num_lineups = 100000000
lineup = data.frame(
  character(1),
  character(1),
  character(1),
  character(1),
  character(1),
  character(1),
  character(1),
  character(1),
  integer(1),
  integer(1),
  integer(1),
  integer(1),
  integer(1),
  integer(1),
  integer(1),
  integer(1),
  integer(1),
  integer(1),
  integer(1),
  integer(1),
  integer(1),
  integer(1),
  integer(1),
  integer(1)
)
dt = as.data.table(lineup)
lineup = dt[rep(1,total_num_lineups)]

Sys.time() - starttime
# Time difference of 15.08011 secs