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