Как работать с большим многотипным фреймом данных в Snow R?

У меня есть большой data.frame из 20 миллионов строк. Этот фрейм данных не только числовой, но и символьный. Используя концепцию «разделяй и властвуй», я хочу разделить этот фрейм данных для параллельного выполнения с помощью пакета snow (в частности, функции parLapply). Проблема в том, что узлам не хватает памяти, потому что части фрейма данных обрабатываются в ОЗУ. Я искал пакет, который поможет мне решить эту проблему, и нашел только один (учитывая многотипный data.frame): пакет ff. Другая проблема связана с использованием этого пакета. Результат разделения ffdf не равен результату разделения commom data.frame. Таким образом, невозможно запустить функцию parLapply.

Знаете ли вы другие пакеты для этой цели? Bigmemory поддерживает только матрицу.


person user2212505    schedule 19.03.2015    source источник
comment
Купите больше памяти или арендуйте ее в облаке.   -  person IRTFM    schedule 19.03.2015
comment
Я не нашел R очень эффективным с параллельным программированием.   -  person Soheil    schedule 19.03.2015


Ответы (1)


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

Результаты здесь. Описание ниже. введите здесь описание изображения

Это говорит о том, что для больших фреймов данных лучший вариант (не совсем самый быстрый, но есть индикатор выполнения):

library(doSNOW)
library(itertools)

# if size on cores exceeds available memory, increase the chunk factor
chunk.factor <- 1 
chunk.num <- kNoCores * cut.factor
tic()
# init the cluster
cl <- makePSOCKcluster(kNoCores)
registerDoSNOW(cl)
# init the progress bar
pb <- txtProgressBar(max = 100, style = 3)
progress <- function(n) setTxtProgressBar(pb, n)
opts <- list(progress = progress)
# conduct the parallelisation
travel.queries <- foreach(m=isplitRows(coord.table, chunks=chunk.num),
                          .combine='cbind',
                          .packages=c('httr','data.table'),
                          .export=c("QueryOSRM_dopar", "GetSingleTravelInfo"), 
                          .options.snow = opts) %dopar% {
                            QueryOSRM_dopar(m,osrm.url,int.results.file)
                          }
# close progress bar
close(pb)
# stop cluster
stopCluster(cl) 
toc()

Обратите внимание, что

  • coord.table - это фрейм/таблица данных
  • kNoCores (= 25 в данном случае) — количество ядер

    1. Distributed memory. Sends coord.table to all nodes
    2. Общая память. Делится coord.table с узлами
    3. Общая память с сокращениями. Разделяет подмножество coord.table с узлами.
    4. Делайте паритет с сокращениями. Отправляет подмножество coord.table узлам.
    5. СНЕГ с порезами и полосой прогресса. Отправляет подмножество coord.table узлам
    6. Вариант 5 без индикатора выполнения

Дополнительную информацию о других вариантах, которые я сравнивал, можно найти здесь.

Некоторые из эти ответы могут подойти вам, хотя они не относятся к распределенному парламенту, и я включил некоторые из них в свои параметры сравнительного анализа.

person Tom Logan    schedule 27.07.2017