2015-06-26 3 views
1

Я хотел бы разделить большой data.frame на куски и передать их индивидуально различным членам кластера.clusterExport to single thread in R parallel

Что-то вроде:

library(parallel) 
cl <- makeCluster(detectCores()) 
for (i in 1:detectCores()) { 
    clusterExport(cl, mydata[indices[[i]]], <extra option to specify a thread/process>) 
} 

Возможно ли это?

+0

Возможно, вам нужно прочитать некоторые страницы справки для пакета 'parallel'. –

+0

@Pascal Я быстро посмотрел на виньетку, которая появляется сначала в Google. По-видимому, это не затрагивает эту проблему. Не могли бы вы указать мне информацию, которая делает? – kennyB

ответ

1

Ниже приведен пример, который использует clusterCall внутри for петли, чтобы отправить другой кусок кадра данных к каждому из рабочих:

library(parallel) 
cl <- makeCluster(detectCores()) 
df <- data.frame(a=1:10, b=1:10) 
ix <- splitIndices(nrow(df), length(cl)) 
for (i in seq_along(cl)) { 
    clusterCall(cl[i], function(d) { 
    assign('mydata', d, pos=.GlobalEnv) 
    NULL # don't return any data to the master 
    }, df[ix[[i]],,drop=FALSE]) 
} 

Обратите внимание, что вызов clusterCall является Подменит cl для того, чтобы выполнить функция на отдельном работнике каждый раз через цикл for.

Вы можете убедиться в том, что рабочие были правильно инициализированы в этом примере с помощью:

r <- do.call('rbind', clusterEvalQ(cl, mydata)) 
identical(df, r) 

Есть более простые способы сделать это, но этот пример минимизирует объем памяти, используемый мастером, и количество данных, переданных каждый из рабочих. Это важно, когда кадр данных очень велик.

+0

Большое спасибо @SteveWeston. Кажется, это работает. Единственная проблема с этим - мне пришлось переупорядочить '' r'' data.frame, чтобы убедиться, что рабочие были правильно инициализированы. Я отвечу на вопрос, как только вы вернетесь к тому, чтобы вернуть данные обратно. Еще раз спасибо! – kennyB

+0

@kennyB 'clusterEvalQ' должен всегда возвращать результаты в« рабочем порядке ». Поэтому, когда вы запускаете этот код, 'same (df, r)' не возвращает 'TRUE'? –

+0

Этот конкретный код действительно возвращает true, и я решил проблему, которую я имел. Я разделил '' data.frame'' на переменную id, которая не была переменной id, которую сортировал '' data.frame''. Поэтому, собирая его, он изменил порядок. – kennyB