У меня есть большой код, и шаг агрегации является текущим узким местом с точки зрения скорости.Ускоренная группа данных. Таблица с использованием нескольких ядер и параллельного программирования
В моем коде я хотел бы ускорить шаг группировки данных, чтобы быть быстрее. SNOTE (простой не тривиальный пример) мои данные выглядит следующим образом:
library(data.table)
a = sample(1:10000000, 50000000, replace = TRUE)
b = sample(c("3m","2m2d2m","3m2d1i3s2d","5m","4m","9m","1m"), 50000000, replace = TRUE)
d = sample(c("3m","2m2d2m","3m2d1i3s2d","5m","4m","9m","1m"), 50000000, replace = TRUE)
e = a
dt = data.table(a = a, b = b, d = d, e = e)
system.time(c.dt <- dt[,list(b = paste(b, collapse=""), d = paste(d, collapse=""), e = e[1], by=a)])
user system elapsed
60.107 3.143 63.534
Это довольно быстро для такого примера больших данных, но в моем случае я все еще ищу для дальнейшего ускорения. В моем случае у меня есть несколько ядер, поэтому я почти уверен, что должен быть способ использовать такие вычислительные возможности.
Я открыт для изменения моего типа данных на объекты data.frame или idata.frame (теоретически idata.frame предположительно быстрее, чем data.frames).
Я провел некоторое исследование и, похоже, пакет plyr имеет некоторые параллельные возможности, которые могут быть полезны, но я все еще борется за то, как это сделать для группировки, которую я пытаюсь сделать. В another SO post they discuss some of these ideas. Я все еще не уверен в том, насколько я достиг этого с помощью этой распараллеливания, поскольку он использует функцию foreach. По моему опыту, foreach function не является хорошей идеей для миллионов быстрых операций, потому что усилие связи между ядрами приводит к замедлению усилий по параллелизации.
Просьба уточнить, что означают слова «concatenate» и «aggregate». Функции, которые они приходят на ум, - это 3: 'list',' c' и 'paste'. И какова функция этого кода. Вынимаем ли столбцы из фреймов данных или работаем над data.tables? Каковы структуры «block.read.parent.cigar» и других входных переменных ..... лучше объясните эту проблему! (По-видимому, кто-то другой согласен. Это не мой downvote.) –
@Dwin, спасибо! Я не уверен, достаточно ли я уточнил в Q, но основной вопрос - как ускорить операцию агрегации для большой таблицы данных, подобной той, что приведена в примере выше. Также иметь в виду, что я могу использовать несколько ядер, поэтому могут быть некоторые идеи умной паралелинизации, которые могут значительно ускорить такую операцию. Надеюсь, что это поможет, я добавил пример – Dnaiel
Я тоже не занимаюсь ничем, но похоже, что хранение ваших данных таким образом (с символьными векторами), как правило, будет медленным, и объединение их будет только замедлять вас (если вы не экспорт для использования в другом программном обеспечении), так как вам придется разбить строки снова и снова для анализа. Вероятно, вы должны использовать специализированный пакет для сигар ... Я ничего не знаю об этом, но вы уже были направлены к одному в более раннем вопросе ... http: //stackoverflow.com/q/18969698/1191259 – Frank