Функция ffdfdply приводит к сбою R и работает очень медленно

изучая, как вычислять задачи в R для больших наборов данных (более 1 или 2 ГБ), я пытаюсь использовать пакет ff и функцию ffdfdply. (См. эту ссылку о том, как использовать ffdfdply: Язык R: проблемы с вычислениями сгруппированы или разделены с помощью пакета ff )

Мои данные имеют следующие столбцы:
"id" "birth_date" "diagnose" "date_diagnose"

Для каждого «id» есть несколько строк, и я хочу извлечь первую дату, когда был поставлен диагноз.

Я бы применил это:

library(ffbase)
library(plyr)
load(file=file_name); # to load my ffdf database, called data.f . 

my_fun <- function(x){
                      ddply( x , .(id), summarize, 
                      age  = min(date_diagnose - birth_date, na.rm=TRUE)) 
          }
result  <- ffdfdply(x = data.f, split = data.f$id,
                    FUN = function(x) my_fun(x) , trace=TRUE) ; 
result[1:10,] # to check.... 

Очень странно, но эта команда: ffdfdply(x = data.f, .... ) приводит к сбою RStudio (и R). Иногда одна и та же команда вызывает сбой R, а иногда нет. Например, если я снова запущу строку ffdfdply (которая сработала в первый раз), R рухнет.

Использование других функций, данных и т. д. будет иметь тот же эффект. В log.txt нет увеличения памяти или чего-либо еще. Такое же поведение при применении сводки по "технике"....

Так что, если у кого-то есть такая же проблема и нашел решение, это было бы очень полезно. Кроме того, ffdfdply работает очень медленно (медленнее, чем SAS...), и я думаю о создании другой стратегии для выполнения таких задач.

Учитывает ли ffdfdply, что, например, набор данных упорядочен по идентификатору? (поэтому не нужно просматривать все данные, чтобы получить одинаковые идентификаторы...).

Итак, если кто-нибудь знает другие подходы к этой проблеме ddply, это было бы действительно здорово для всех пользователей «больших наборов данных в R с малой оперативной памятью».

Это мой sessionInfo()

R version 2.15.2 (2012-10-26)
Platform: i386-w64-mingw32/i386 (32-bit)

locale:
[1] LC_COLLATE=Danish_Denmark.1252  LC_CTYPE=Danish_Denmark.1252   
[3] LC_MONETARY=Danish_Denmark.1252 LC_NUMERIC=C                   
[5] LC_TIME=Danish_Denmark.1252    

 attached base packages:
[1] tools     stats     graphics  grDevices utils     datasets  methods  
[8] base     

other attached packages:
[1] plyr_1.7.1   ffbase_0.6-1 ff_2.2-10    bit_1.1-9

r ff
person Miguel Vazq    schedule 19.11.2012    source источник
comment
ffdfdply не учитывает, что ваши данные отсортированы по идентификатору. Но чтобы не делать слишком много ffthat, если у вас много идентификаторов, он попытается посмотреть, какие данные идентификаторов можно поместить в оперативную память блоками. Следовательно, уменьшая количество использования ffwhich.   -  person    schedule 19.11.2012


Ответы (1)


Я также заметил это при использовании пакета, который мы недавно загрузили в CRAN. Похоже, это вызвано перегрузкой в ​​пакете ffbase функций экстрактора и установки "[.ff" и "[‹-.ff" из пакета ff.

Я удалю эту функцию из пакета и скоро загружу ее в CRAN. А пока вы можете использовать версию 0.7 ffbase, которую вы можете получить здесь: http://dl.dropbox.com/u/25690064/ffbase_0.7.tar.gz

и установить его как:

download.file("http://dl.dropbox.com/u/25690064/ffbase_0.7.tar.gz", "ffbase_0.7.tar.gz")
shell("R CMD INSTALL ffbase_0.7.tar.gz")

Дайте мне знать, если это помогло.

person Community    schedule 19.11.2012
comment
Привет @jwijffels, спасибо за быстрый ответ. Да, я установил пакет, как вы предлагаете, и теперь ffdfdply работает, но subset() не работает... вызывает сбой R... Также о втором пункте (скорость), как вы думаете, есть ли способ увеличить скорость данные упорядочены по идентификатору, например? - person Miguel Vazq; 19.11.2012
comment
Привет, Мигель, приятно знать, что вы столкнулись с теми же проблемами, с которыми столкнулся я на прошлой неделе. Я также заметил, начиная с версии 0.6-1, проблему с subset.ffdf. Это потому, что реализация была изменена с версии 0.5. Я замечу другого автора пакета, поскольку он написал его так, чтобы мы могли загрузить новую версию в CRAN. - person ; 19.11.2012
comment
О проблеме со скоростью. Как я указал в stackoverflow.com/questions/13398061/, не передавайте весь ffdf, как вы это делаете (ffdfdply(x = data.f ...), а передавайте только данные, которые вам нужны (ffdfdply(x = data.f[c(id,date_diagnose,birth_date)],... иначе вы получите все свои данные из файлов ff в ОЗУ, и вы используете только 3 столбца в своей функции. Также обратите внимание, что ddply не самая быстрая функция - doBy быстрее или используйте data.table внутри FUN.Подсказка.Если у вас несколько процессоров, вы можете использовать параллельный пакет. - person ; 19.11.2012
comment
Я знаю, что беру только те столбцы, которые мне нужны, но, поскольку он давал сбой, я делал самый простой, чтобы определить причину. Мне кажется, что как только данные упорядочены, например, по идентификатору, создание этих сводок становится намного проще, потому что это вопрос чтения только один раз от 1 до nrows, а когда идентификатор изменяется, затем сделать другую сводку ... Можем ли мы сделать это с помощью ff или других пакетов больших данных? Любой намек? В любом случае спасибо за другие предложения. Моя цель состоит в том, чтобы этот король (очень распространенных) задач работал быстрее, чем SAS или SQL, без ошибок памяти. - person Miguel Vazq; 20.11.2012
comment
Привет, спасибо за отзыв. Еще вопрос: вы уже сравнили скорость SAS со скоростью SQL со скоростью ff для вашего вопроса, как в stat.ethz.ch/pipermail/r-packages/2010/001178.html? Можете ли вы указать причину, по которой сначала упорядочить данные будет быстрее, чем выполнить несколько операций ffwhat? - person ; 20.11.2012
comment
Привет, да, это хорошая вещь, чтобы сделать это сравнение. Я опубликую результаты, как только они будут у меня. Причина, по которой упорядочивание данных ускорится, заключается в том, что программе нужно будет только ОДИН РАЗ прочитать индексы от 1 до nrows, чтобы непрерывно и найти, когда происходит изменение идентификатора (для этого примера), сохранить те же самые данные идентификатора и вычислить функцию. Аналогичная процедура предлагается здесь: r.789695.n4.nabble.com/ (в 4-м посте) (мне кажется, что это медленно). Используйте ffwhat для каждого идентификатора, каждый раз просматривая все данные, не так ли? - person Miguel Vazq; 23.11.2012
comment
Если у вас есть сравнение с SQL/SAS, опубликуйте где-нибудь скорость. В настоящее время число сканирований по идентификатору равно одному для выполнения таблицы (чтобы увидеть, сколько раз встречается каждый идентификатор), затем выполняется ffthat (по всей таблице) столько раз, сколько блоков идентификаторов может быть помещено в ОЗУ. . - person ; 23.11.2012
comment
к вашему сведению. Сбой, связанный с subset.ffdf (произошедший, если вы не указали аргумент select), теперь устранен в версии 0.6-2 пакета ffbase. Смотрите файл новостей: cran.r-project.org/web/packages/ffbase /НОВОСТИ - person ; 28.11.2012
comment
Привет, спасибо за это обновление. Что касается скорости, сравнения практически невозможны с моими данными/компьютером, потому что время стремится к бесконечности с R, используя любой из методов, о которых мы говорили (SAS сделает это за 5 минут, а R сделает это более чем за 1 час). . Я также протестировал аналогичные случаи с меньшими базами данных и получил такие же результаты: SAS/SQL намного лучше работает по идентификатору, когда имеется много разных идентификаторов и всего несколько строк для каждого одного и того же идентификатора (поэтому группы с одинаковым идентификатором маленькие и есть много разных групп). Любое предложение?? - person Miguel Vazq; 29.11.2012
comment
Да, профилируйте свой код, чтобы увидеть, где находится вычислительная нагрузка. Вероятно, это потому, что вы использовали ddply внутри FUN, которая не является самой быстрой функцией в мире. - person ; 29.11.2012
comment
Привет jwijffels, и спасибо за ответы. Да, кажется, что ddply действительно очень медленный. data.table ускоряет этот процесс в 100 раз. При использовании ffdfdply мое приложение R дает сбой... упс. Это мой код: age ‹- function(x){ xt ‹- data.table(x), xt[,list (min(date, na.rm=T), max(date, na.rm=T)) , by=list(id)]} результат ‹- ffdfdply(x = data[c(id, date)], split = data$id, FUN = function(x) age(x), trace=TRUE). Но в любом случае, я приближаюсь к комбо ffdfdply и data.table, если ffdfdply не падает... - person Miguel Vazq; 29.11.2012
comment
Data.table действительно лучший вариант. Но, пожалуйста, убедитесь, что вы установили последнюю версию ffbase на CRAN, и убедитесь, что ваш FUN возвращает data.frame, как описано в ?ffdfdply, а не data.table. Это решит вашу скорость и проблему сбоев. - person ; 29.11.2012
comment
Привет, jwijffels, я все еще получаю эти сбои не только при работе с ffdfdply, но и с некоторыми другими [,] и поднастройками. Я использую последнюю версию ff и ffbase.... - person Miguel Vazq; 19.12.2012
comment
Привет, я почти уверен, что вы не установили последнюю версию ffbase, которая находится в CRAN. Если это не поможет, вы можете написать мне напрямую, вместо того, чтобы продолжать комментировать stackoverflow. - person ; 19.12.2012