R和Simmer:大数据帧上的性能提升

时间:2018-11-13 14:18:27

标签: 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包含35万个数据集,这就是我的模拟花费更多时间的点。

head(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

vs

用户系统已使用 608.443 0.270 608.186

My CPU

有没有一种方法可以提高模拟效果?我使用Simmer 4.1.0和Rcpp 1.0.0。内存似乎不是问题。

1 个答案:

答案 0 :(得分:0)

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

在内部,属性始终为double,因此逐行进行了大量转换,这显然占用了大部分执行时间(!)。尝试将表格转换为simmer之前。使用dplyr

task_df <- mutate_all(task_df, as.double)

模拟应该更快,并且增加行数的执行时间应该或多或少地线性增长。显而易见,为什么这么多强制转换会降低性能,尽管我不确定为什么它会使执行时间变为非线性。

无论如何,在将来的发行版中,我们可能希望自动应用此功能,以便用户不必为这些性能问题而烦恼。