Я разбиваю фрейм данных на split()
, чтобы использовать функцию parLapply()
для вызова функции на каждом разделе параллельно. Кадр данных имеет 1,3 миллиона строк и 20 столбцов. Я разбиваю/разбиваю на два столбца, оба типа символа. Похоже, есть уникальные коды ~ 47K и уникальные коды ~ 12K, но не все пары идентификаторов и кода совпадают. Итоговое число разделов составляет ~ 250K. Вот split()
линия:Быстрая альтернатива расколу в R
system.time(pop_part <- split(pop, list(pop$ID, pop$code)))
Перегородки будет подаваться в parLapply()
следующим образом:
cl <- makeCluster(detectCores())
system.time(par_pop <- parLapply(cl, pop_part, func))
stopCluster(cl)
Я пусть split()
код в одиночку работать почти час, и это не полный. Я могу разделить только ID, что занимает ~ 10 минут. Кроме того, студия R и рабочие потоки потребляют ~ 6 ГБ оперативной памяти.
Причина, по которой я знаю результирующее количество разделов, - это эквивалентный код в интеграции данных Pentaho (PDI), который запускается через 30 секунд (для всей программы, а не только для «разделенного» кода). Я не надеюсь на этот тип производительности с R, но что-то, что, возможно, завершается в 10-15 минут в худшем случае.
Главный вопрос: есть ли лучшая альтернатива расколу? Я также пробовал ddply()
с .parallel = TRUE
, но он также прослужил более часа и никогда не заканчивался.
Спасибо, я попробую. Ха, я на самом деле написал R-код изначально, а затем портировал его в PDI (у меня больше опыта с R, чем с PDI). – argoneus
Я запустил код 'split(), который вы отправили, и ждал почти час, но он так и не завершился. – argoneus
Пара дополнительных предложений, добавленных вокруг split, которые должны принимать порядка секунды или меньше. Может быть, факторы также заставляют func также замедляться? –