我正在尝试逐步提高我正在处理的项目的速度。该项目目前需要初始化一个数据帧,其中包含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行,这是我试图解决的第一个瓶颈。任何关于如何加快这一步骤的想法将不胜感激。
额外 - 如果需要,我可以提供有关项目的其他信息,但是考虑按问题集中问题可能会更好。如果容器更快,我愿意将容器(转换为数据表或其他结构)切换。
谢谢!
答案 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