R - ожидаемая скорость do.call (rbind, ...) - PullRequest
0 голосов
/ 09 сентября 2018

У меня есть список под названием prebindgames с чуть более 2 миллионами записей Каждая запись списка представляет собой однорядный фрейм данных с 6 столбцами. Чтобы дать представление о типе данных в каждом столбце, каждый фрейм данных имеет форму:

data.frame(Time = double(),
           HScore = numeric(),
           AScore = numeric(),
           HTeam = character(),
           ATeam = character(),
           GameID = character(),
           stringsAsFactors = FALSE)

Числовые столбцы не превышают тысяч, а символьные столбцы не превышают 10 символов. Я попытался запустить do.call(rbind, prebindgames), и он работал всю ночь без признаков остановки. Я попытался еще раз для некоторых меньших значений:

start_time <- Sys.time()
allgamespbp <- do.call(rbind, prebindgames[1:1000]) 
end_time <- Sys.time()
print(end_time - start_time)
Time difference of 1.059694 secs

prebindgames[1:10000]
Time difference of 11.00168 secs

prebindgames[1:20000]
Time differences of 37.30913 secs

Итак, я уже наблюдаю некоторый экспоненциальный рост, который объясняет, почему вещи выходят из-под контроля при попытке связать все 2 миллиона за один вызов. Итак, мои три вопроса:

1) Это нормально? Если бы я основывал свою ожидаемую скорость на списке с 10 тысячами записей, это заняло бы около 40 минут для 2 миллионов

2) Что я могу сделать, чтобы ускорить этот процесс? Из того, что я могу сказать, замена значений в списке заданной длины с использованием do.call является наиболее эффективным способом связать строки вместе.

3) Если это так быстро, как я могу, получить его без существенных изменений в моем коде или оборудовании, могу ли я изменить его, чтобы посмотреть мой прогресс?

Предыстория: это для веб-проекта, где я объединю результаты многих игр NBA в один большой стол. Весь код можно найти здесь: https://github.com/NicholasHassan/NBAComeback

Если вам интересно, вы можете перейти к строке 54 из NBA Comeback.R и использовать pbpurls.csv, чтобы увидеть, как происходит процесс очистки.

1 Ответ

0 голосов
/ 09 сентября 2018

Это похоже на сценарий, в котором data.table может быть значительно (в 100-1000 раз) быстрее.

https://www.r -bloggers.com / конкатенации-а-список-о-данных-кадров /

Есть ли замена do.call более высокого порядка (rbind, ...)?

Любопытно, что говорят ваши тесты, если вы замените выше:

allgamespbp <- data.table::rbindlist(prebindgames[1:1000]) 
...