c++ - R 和 Simmer : Performance boost on large data frames

标签 c++ r simulation

我有自己的关于实际事件/任务的数据框,我使用 simmer r 包来模拟如果有不同的资源可用,可以完成多少任务。我的模拟在我的数据框中运行得非常快,最多可达 120.000 行。

rm(list=ls())
library(dplyr)
library(simmer)
library(simmer.plot)

load("task_df.RDATA")

working_hours <- 7.8
productivity <- 0.7
no.employees <- 292

SIM_TIME <- round((working_hours*productivity*60), 0)+1

employees <- vector("character")

for (i in 1:no.employees) {
  employees[i] <- paste("employee", i, sep="_")
}

taskTraj <- trajectory(name = "tasK simulation") %>%
  simmer::select(resources = employees, policy = "shortest-queue") %>%
  seize_selected(amount = 1) %>%
  timeout_from_attribute("duration") %>%
  release_selected(amount = 1)


arrivals_gen <- simmer() 

for (i in 1:no.employees) {arrivals_gen %>%
    add_resource(paste("employee", i, sep="_"), capacity = 1) 
} 

ptm <- proc.time()

arrivals_gen <- arrivals_gen %>%
  add_dataframe("Task_", taskTraj, task_df, mon = 2, col_time = "time", time = "absolute",  col_priority="priority")  %>%
  run(SIM_TIME)

proc.time() - ptm

但我的数据框 tasK_df 包含 350k 数据集,这就是我的模拟花费更多时间的地方。

头(task_df,n = 50)

workload_shift  task_id duration priority time
1        20180403 68347632        3    2.502    0
2        20180403 68151881       10   24.478    0
3        20180403 68069718        3    0.724    0
4        20180403 68345621        4    2.226    0
5        20180403 68508858        3   36.062    0
6        20180403 66148996        3    9.421    0
7        20180403 68565066        2   24.478    0
8        20180403 68005344        3    7.910    0
9        20180403 55979902        3    3.732    0
10       20180403 66452138        2    2.502    0
11       20180403 68051869       10    2.226    0
12       20180403 68561364       10    3.584    0
13       20180403 59292591        3    2.138    0
14       20180403 68415657       10    2.853    0
15       20180403 66848400        3    2.290    0
16       20180403 68454851       10    6.167    0
17       20180403 68361846       10   11.688    0
18       20180403 68572723        2    6.259    0
19       20180403 68520328        2   24.478    0
20       20180403 68500955       10    1.855    0
21       20180403 67000753        3  219.751    0
22       20180403 68487613        3    8.131    0
23       20180403 68333674        4    5.263    0
24       20180403 66423486        3    2.290    0
25       20180403 68241616        5    1.470    0
26       20180403 68415001        4    3.584    0
27       20180403 67487967        3    2.636    0
28       20180403 68494771       10    6.259    0
29       20180403 67673981       10    2.226    0
30       20180403 68355727        3    2.613    0
31       20180403 36942995        3    0.590    0
32       20180403 66633446        3    5.968    0
33       20180403 68461510        2   24.478    0
34       20180403 67126138        3    0.357    0
35       20180403 68485682        3    8.131    0
36       20180403 67852953       10    2.290    0
37       20180403 68150106       10    6.259    0
38       20180403 67833053       10    4.114    0
39       20180403 67816673        3    6.259    0
40       20180403 68041431        5    2.502    0
41       20180403 66283761        5    2.502    0
42       20180403 68543314        2   26.302    0
43       20180403 68492843        3    2.290    0
44       20180403 68556960        4    2.853    0
45       20180403 66885335        3    5.975    0
46       20180403 66249231        5    2.636    0
47       20180403 68242565       12    1.470    0
48       20180403 68530355        2    2.290    0
49       20180403 66683717        5    5.705    0
50       20180403 67802538        4    0.864    0

用户系统已过期
76.745 0.039 76.717

对比

用户系统已过期 608.443 0.270 608.186

My CPU

有没有办法提高我的模拟能力?我使用 simmer 4.1.0 和 Rcpp 1.0.0。内存似乎不是问题。

最佳答案

我拿了你的表并简单地复制它来构建 100k 和 400k 数据集,我确认了这个问题:执行时间不是线性的。

在内部,属性总是double,所以有很多转换,逐行,这显然占用了大部分执行时间(!)。在将表格输入 simmer 之前尝试转换表格。使用 dplyr,

task_df <- mutate_all(task_df, as.double)

模拟应该更快,并且增加行数的执行时间应该或多或少线性增长。很明显为什么这么多转换会降低性能,但我不确定为什么它会使执行时间非线性。

无论如何,在未来的版本中,我们可能希望自动应用它,这样用户就不必担心这些性能问题。

关于c++ - R 和 Simmer : Performance boost on large data frames,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53283052/

相关文章:

C++11:无法将参数从 'T *const' 转换为 'T *&&'

C++17 部分推导指南

c++ - Visual Studio 2015 自动包含缺少的包含

c++ - 我正在尝试在 Omnet 中模拟网络。但是我收到一条错误消息“ Unresolved inclusion <csimplemodule.h>?我应该如何解决这个问题?

r - 在 R 中循环一组数字生成命令

c++ - 将作用域枚举转换为 int

r - 在 rmd 文件中保存和显示图

r - Ggplot条形图: how to show precentage on the y-axis

r - 使用 geom_bar 按列中一个特定值的计数对 y 轴进行排序

simulation - 纳什-萨特克利夫效率 (NSE) 的值(value)是多少?