У меня довольно большой набор данных (~ 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
. Я смог проделать свою задачу сворачивания прямо.
Я думаю, что я оставлю обязательный комментарий, ссылаясь на пакет ** data.table **, который, как правило, намного быстрее при таких вещах. – joran
Эй, ты избил меня! –
У вас действительно есть 8 ядер? Вернее, Intel с четырьмя ядрами и четырьмя «гиперпотоковыми» ядрами? У меня есть приложение, работающее под MPICH (не R), которое хорошо масштабируется до 4 при 50% CPU, но работает значительно медленнее, когда запрашивается 8 ядер, давая 100% процессор. –