Использование plyr, doMC и Sumumize () с очень большим набором данных? - PullRequest
7 голосов
/ 29 декабря 2011

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

library(plyr)
require(doMC)
registerDoMC()

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

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

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

ОБНОВЛЕНИЕ: Как и во многих вещах в жизни, оказывается, что я делал другие глупые вещи в другом месте моего кода,и что весь вопрос мультиобработки становится спорным в данном конкретном случае.Однако для задач свертывания больших данных я буду помнить data.table.Мне удалось воспроизвести мою задачу складывания простым способом.

1 Ответ

6 голосов
/ 29 декабря 2011

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

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

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