【发布时间】:2019-04-03 02:59:11
【问题描述】:
我有一个 data.table 值,我在循环中计算汇总统计数据,并寻求汇总汇总结果以进行额外处理。但是,由于聚合,循环处理时间出乎意料地长,我正在寻求更快的解决方案。
该方法非常类似于此处讨论的方法 (Assign a vector to a specific existing row of data table in R)。
代码(为了便于阅读而略作删节,但保留材料组件说明性):
library(data.table);
x <- data.table(matrix(double(),nrow=10000,ncol=120));
system.time({for (i in NROW(x):1) {
m <- matrix(rnorm(8*15),nrow=8,ncol=15);
}});
# user system elapsed
# 0.165 0.006 0.171
system.time({for (i in NROW(x):1) {
m <- matrix(rnorm(8*15),nrow=8,ncol=15);
as.list(t(m[1:8,]));
}});
# user system elapsed
# 0.245 0.001 0.249
system.time({for (i in NROW(x):1) {
m <- matrix(rnorm(8*15),nrow=8,ncol=15);
x[i,] <- as.list(t(m[1:8,]));
}});
# user system elapsed
# 36.227 0.682 37.529
罢工>
# Obtain input data.table
inputdt <- fread('filename');
# Preallocate summary statistics aggregate
sumstatsdt <- data.table(matrix(double(),nrow=10000,ncol=120));
# Loop over input data.table (the *apply suite not suitable for mypkg::calcstats())
for (i in NROW(inputdt):1) {
# Produce a matrix of summary statistics for the row (of type double)
sumstat_matrix <- mypkg::calcstats(inputdt,...);
# Aggregate the summary statistics (where "a","b","c",... are matrix row names of ordered statistics)
# >>>> This is the operation that leads to lengthy execution time
sumstatsdt[i,] <- as.list(t(sumstat_matrix[c("a","b","c",...),]));
};
输入 data.table 包含 10,000 个具有 8 个属性的观测值,总共需要存储 120 万个汇总统计信息(每个类型为“double”)。注释掉执行聚合的循环中的最后一行时,总处理时间约为 24 秒。使用聚合运行时,总处理时间增加到 34 分钟。
我尝试使用具有大致相似性能结果的data.frame 和cbind() 的可比较代码(没有机会尝试tidyverse 套件)。认识到深度复制操作会稍微慢一些,尽管在相对较小的数据集下执行时间差异的大小似乎表明了不同的问题。
在最近的 Fedora 安装上运行 R v3.4.4、data.table v1.11.4。内存使用量可以忽略不计(在 R 脚本执行期间使用的系统 RAM 不到 3%)。在脚本执行期间,与 R 会话密切相关的 2.1GHz CPU 处理器之一以接近 100% 的速度运行。没有与该核心关联的其他进程,并且剩余的核心大部分处于空闲状态。 (NB:说明性代码在不同机器上的 KVM guest 中运行)
旁注:也很好奇为什么 CPU 瓶颈表现为内存问题。
感谢您的宝贵时间,并乐于提供有用的其他信息。
编辑[2018.10.31]
- 包括42 要求的说明性代码
【问题讨论】:
-
删节码???
-
正确 - 与准备包函数的其他参数和列出矩阵的所有行名有关。根据提出的问题,没有任何遗漏会影响审查代码的能力。谢谢
-
提问者确实会省略一些关键的内容是很常见的。试图猜测可能是什么通常是徒劳的。因此需要minimal reproducible example。
-
毫无疑问,希望编辑中的可重现代码证明更有用。请调整“x”中的行数以缩放时间。
标签: r data.table tibble