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