c++ - R 和 Simmer:大型数据帧的性能提升
问题描述
我在实际事件/任务上有自己的数据框,我使用 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
有没有办法提高我的模拟?我使用 simmer 4.1.0 和 Rcpp 1.0.0。内存似乎不是问题。
解决方案
我拿了你的表并简单地复制它来构建 100k 和 400k 数据集,我确认了这个问题:执行时间不是线性的。
在内部,属性总是double
,因此有大量的逐行转换,这显然占用了大部分执行时间(!)。尝试将您的表转换为simmer
. 使用dplyr
,
task_df <- mutate_all(task_df, as.double)
模拟应该快得多,并且增加行数的执行时间应该或多或少地线性增长。很明显为什么这么多的演员会降低性能,尽管我不确定为什么它会使执行时间非线性。
无论如何,在未来的版本中,我们可能希望自动应用它,这样用户就不必担心这些性能问题。
推荐阅读
- angular - 带有过滤器的垫表列排序箭头不可见
- python - 导入错误:未找到模块对象检测
- delphi - firemonkey 将 mp3 流转换为十六进制和反向
- python - 为什么 Tensorflow 在重新训练过程中向我发送此错误“无法打开文件 'tensorflow/examples/image_retraining/retrain.py':”
- ios - 以编程方式创建的 UIView 的框架为 0
- git - 是否有可能“忘记”某个主提交的所有过去并假设当前的提交是初始的?
- powershell - 始终从任务计划程序运行 Windows Powershell 脚本
- android - 检索到的数据未显示在小部件中
- swift - 如何使用 swift 使视图与集合视图一起滚动
- python - 如何使用 PYTHON 访问保存为 JSON 中键列表的所有字典的第一个键的值