Использование plyr, doMC и summarise() с очень большим набором данных?

У меня есть довольно большой набор данных (~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, так что если есть лучший способ подумать об этом, я открыт для предложений.

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

7
задан Matt Dowle 3 January 2012 в 12:55
поделиться