У меня есть функция rollapply, которая делает что-то очень простое, однако более миллиона точек данных эта простая функция работает довольно медленно. Я хотел бы знать, можно ли предоставить информацию для rollapply о том, как сделать следующий переход, а не определять саму функцию.
Конкретно, я выполняю скользящее окно для обнаружения основных статистических аномалий.
Функция рулонного применения:
minmax <- function(x) { max(x) - min(x) }
вызывается:
mclapply(data[,eval(vars),with=F],
function(x) rollapply(x,width=winSize,FUN=minmax,fill=NA),
mc.cores=8)
Где data
— таблица данных из 8 столбцов, а winsize
— 300.
Этот вызов занимает около 2 минут на 8 ядрах. Это одно из основных узких мест для вычислений в целом. Однако я могу себе представить, что мы можем отсортировать их (по значению и индексу), а затем выполнять сравнения Olog(n) каждый раз, когда мы скользим.
Однако я часто вижу сообщения, предлагающие отказаться от циклов for и использовать lapply. Каков следующий логический шаг для дальнейшей оптимизации?
lapply
), написаны несколько лет назад, то они могут говорить об этом, потому что циклыfor
раньше работали медленнее. С тех пор это было исправлено (R-3.0?), поэтому предположение о том, что циклыfor
всегда медленнее, возможно, опрометчиво. Бывают случаи, когда имеет смысл не использовать циклfor
(когда вы не хотите побочных эффектов и хотите зафиксировать результат каждой итерации в цикле), и в этом случае один из функции*apply
могут иметь больше смысла. - person r2evans   schedule 07.02.2019mclapply
, меня больше всего беспокоит объем данных, передаваемых между ядрами. Например, если вы переходите отmc.cores=8
к (скажем)=4
, удваивается ли время выполнения? А как насчет=12
(если у вас есть больше)? Если вы не видите явного повышения производительности при увеличении количества ядер, возможно, вы испытываете отставание из-за копирования данных (в зависимости от вашей параллельной настройки). Так что, возможно, ускорение связано не только с вашим UDF (который настолько эффективен, насколько вы можете получить в необработанном виде). - person r2evans   schedule 07.02.2019ssh
иtmux
(screen
) достаточно; когда мне нужно увидеть графики, я используюrmote
. Я читал о ESS-Remote, но никогда не пробовал. - person r2evans   schedule 07.02.2019