2011-12-29 4 views
7

У меня довольно большой набор данных (~ 1,4 м строк), что я делаю некоторое разделение и обобщение. Все это занимает некоторое время, чтобы работать, и мое окончательное приложение зависит от частого бега, так что моя мысль была использовать doMC и .parallel=TRUE флага с plyr как так (немного упрощен):Используя plyr, doMC и суммируйте() с очень большим набором данных?

library(plyr) 
require(doMC) 
registerDoMC() 

df <- ddply(df, c("cat1", "cat2"), summarize, count=length(cat2), .parallel = TRUE) 

Если я установил количество ядер в явном виде до двух (с использованием registerDoMC(cores=2)) мой 8 ГБ оперативной памяти увидеть меня, и он бреет приличное количество времени. Однако, если я позволяю ему использовать все 8 ядер, я быстро исчерпаю память из-за того, что каждый из вильчатых процессов, похоже, клонирует весь набор данных в памяти.

Мой вопрос заключается в том, можно ли использовать параллельные возможности выполнения plyr в более экономном режиме памяти? Я попытался преобразовать мой dataframe в big.matrix, но это просто казалось, чтобы заставить все это обратно, используя одно ядро:

library(plyr) 
library(doMC) 
registerDoMC() 
library(bigmemory) 

bm <- as.big.matrix(df) 
df <- mdply(bm, c("cat1", "cat2"), summarize, count=length(cat2), .parallel = TRUE) 

Это мой первый набег в многоядерной R вычислений, поэтому, если есть лучший способ думая об этом, я открыт для предложения.

UPDATE: Как и многие вещи в жизни, то получается, что я делал Другие глупостей в другом месте в моем коде, и что весь вопрос многопроцессорной обработки становится спорным моментом в данном конкретном случае. Однако для больших задач сложения данных я буду помнить data.table. Я смог проделать свою задачу сворачивания прямо.

+3

Я думаю, что я оставлю обязательный комментарий, ссылаясь на пакет ** data.table **, который, как правило, намного быстрее при таких вещах. – joran

+0

Эй, ты избил меня! –

+2

У вас действительно есть 8 ядер? Вернее, Intel с четырьмя ядрами и четырьмя «гиперпотоковыми» ядрами? У меня есть приложение, работающее под MPICH (не R), которое хорошо масштабируется до 4 при 50% CPU, но работает значительно медленнее, когда запрашивается 8 ядер, давая 100% процессор. –

ответ

6

Я не думаю, что plyr делает копии всего набора данных. Однако при обработке фрагмента данных это подмножество копируется работнику. Поэтому, при использовании большего числа рабочих, в подсистеме одновременно попадает больше подмножеств (т. Е. 8 вместо 2).

Я могу придумать несколько советов, вы можете попробовать:

  • Поместите ваши данные, чтобы структуры массива в смену в data.frame и использовать adply сделать подведение итогов. массивы намного эффективнее с точки зрения использования памяти и скорости. Я имею в виду использование нормальных матриц, а не big.matrix.
  • Попробуйте, в некоторых случаях это может привести к увеличению скорости на несколько порядков. Я не уверен, поддерживает ли data.table параллельную обработку, но даже без распараллеливания data.table может быть более быстрым. См. blog post of mine, сравнивая ave, ddply и data.table для обработки кусков данных.
+1

Возможно, вам захочется проверить этот пост в блоге.Кажется, что три функции, которые вы сравниваете, выполняют разные задачи: только один из них вычисляет среднее значение, насколько я могу судить. –

+0

Спасибо, я посмотрю! Я подозреваю, что это не меняет результат публикации, а именно, что data.table намного быстрее. –

Смежные вопросы