R and Simmer: повышение производительности на больших фреймах данных - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть собственный фрейм данных о реальных событиях / задачах, и я использую пакет 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 содержит 350 тыс. Наборов данных, и в этом месте мое моделирование занимает гораздо больше времени.

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

против

пользовательская система истекла 608,443 0,270 608,186

Мой ЦП

Есть ли способ повысить мою симуляцию?Я использую симмер 4.1.0 и Rcpp 1.0.0.Память не кажется проблемой.

1 Ответ

0 голосов
/ 15 ноября 2018

Я взял вашу таблицу и просто скопировал ее для построения наборов данных 100k и 400k, и я подтверждаю проблему: время выполнения не является линейным.

Внутренне, атрибуты всегда double, поэтому есть много преобразований, строка за строкой, которые, очевидно, занимают большую часть времени выполнения (!). Попробуйте преобразовать ваш стол до подачи в simmer. Использование dplyr,

task_df <- mutate_all(task_df, as.double)

Симуляция должна быть намного быстрее, а время выполнения для увеличения количества строк должно расти более или менее линейно. Понятно, почему так много приведений ухудшают производительность, хотя я не уверен, почему это делает время выполнения нелинейным.

В любом случае, в будущих выпусках мы можем захотеть применить это автоматически, чтобы пользователю не пришлось беспокоиться об этих проблемах производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...