Швидкість обчислення в R?


16

Мені було доручено перенести одну з наших нині великих великих стохастичних моделей з SAS і перейти на нову мову. Особисто я віддаю перевагу традиційній компільованій мові, але ІП хоче, щоб я перевірив R, яким я ніколи не користувався. Нашою мотивацією для виведення моделі з SAS є (1) багато людей не мають до неї доступу, оскільки SAS дорогий, (2) ми прагнемо відійти від мови, що тлумачиться, і (3) SAS повільний для тип моделі у нас.

Для (1) очевидно, що R задовольняє потребу, щоб він був вільним. Для (2) в ідеалі ми хотіли б створити виконуваний файл, але R зазвичай використовується як сценарій мови. Я бачу, що недавно хтось випустив компілятор R - це добре сприйняли? Чи просто у використанні? Ми швидше не змусимо користувача завантажувати R. Для (3) наша проблема з SAS - це весь час, витрачений на введення / виведення на запис та читання наборів даних. Наша модель обчислювально інтенсивна, і ми часто обмежені часом виконання. (наприклад, не рідкість, коли хтось викрадає комп’ютери людей протягом вихідних, щоб виконувати пробіжки.) У нас у Фортрансі побудована подібна модель, яка не має тієї ж проблеми, оскільки вся робота робиться в пам'яті. Як працює R? Чи буде це те саме, що і SAS, якщо він працює у сходах даних, читання та запис файлів? Або це може зробити маніпуляцію з масивом в пам'яті?


Зазвичай ви можете пришвидшити sas, виконавши всю свою роботу за один крок даних. Це має скоротити час вводу / виводу, оскільки ви фактично читаєте дані лише один раз. Використання безлічі процедур також сповільнить вас. Наприклад, якщо ви моделюєте неодноразові виклики proc glm або proc logistic (скажімо, для завантажувальної програми), швидше створити величезний набір даних і використовувати оператор a, ніж викликати багато викликів PRO (скажімо, використовуючи цикл макро% do do). якщо ви добре програмуєте sas, у вас не виникають проблеми з часом роботи через читання та виведення файлів (принаймні, не більше ніж інше програмне забезпечення
ймовірністьloglogic

Крім того, ви можете використовувати тимчасові масиви в кроках даних sas аналогічно тому, як ви використовували б матриці в Р.
ймовірність

Відповіді:


18

R працює в пам’яті - тому ваші дані дійсно потребують вмісту в пам'ять для більшості функцій.

Пакет компілятора, якщо я думаю про те, про що ви думаєте ( пакунок компілятора Луки Тірні, що постачається разом із R), не є тим самим, що мова для компіляції у традиційному розумінні (C, Fortran). Це байт-компілятор для R у значенні байтового коду Java, виконаного Java VM, або байтного складання коду Emacs LISP. Він не компілює код R в машинний код, а готує код R в байт-код, щоб його можна було використовувати більш ефективно, ніж необроблений код R для інтерпретації.

Зауважте, що якщо ви добре сформували Фортран, ви, мабуть, могли б мати кращі з обох світів; R може викликати складені процедури Fortran.


Спасибі! Приємно знати, що я міг би мати чудову графіку R та складати підпрограми Fortran. Це може бути відповідь!
Меліса

2
Просто для розширення інформації про пам'ять Гевіна про пам'ять: див. Розділ «Велика пам’ять» у цьому перегляді завдань CRAN, якщо ви працюєте з більшими наборами даних: cran.r-project.org/web/views/HighPerformanceComputing.html
Брендон Бертельсен

1
Також думаю, що важливо відзначити, що Rcpp, ймовірно, може бути використаний для збільшення прирістних результатів.
Брендон Бертелсен

Rcpp корисно обертати C ++ для використання в / з R. Це допомагає (надзвичайно), але все ще використовує основні інструменти R для виклику компільованого коду. Якщо в ОП вже є коди Fortran або Fortran, Rcpp може бути менш корисним.
Відновіть Моніку - Г. Сімпсон

13

Я звик SAS протягом 15 років, і почав Rсерйозно використовувати останні 6 місяців, з деякими хитрощами в ньому на пару років попереду. З точки зору програмування, R чи здійснюють маніпулювання даними безпосередньо, немає еквівалента DATAабо PROC SQLпроцедур, оскільки вони не потрібні (останні є більш ефективними, SASколи існує багато маніпуляцій з даними, що виконуються із зовнішніх джерел даних, наприклад, адміністративних даних). Це означає, що тепер, коли я переймаюсь цим, обробка даних відбувається швидше Rі вимагає набагато менше коду.

Основне питання, з яким я стикався, - це пам’ять. Не всі R-пакети дозволяютьWEIGHT специфікувати типи, тому якщо у вас є SASнабори даних зі змінними, які використовуються у FREQабо REPLICATEоператорах, у вас можуть виникнути проблеми. Я переглянув ffі bigmemoryпакунки в R, але вони, здається, не сумісні з усіма R-пакетами, тому якщо у вас дуже великі набори даних, які потребують порівняно рідкісних аналізів та їх агрегування, у вас можуть виникнути проблеми із пам'яттю.

Для автоматизації, якщо у вас є, SAS macrosви повинні мати можливість запрограмувати еквівалент Rі запустити як пакет.

Для кодування в Rя використовував Notepad++і встановлював мовуR , і тепер я відкриваю для себе радощі R Studio. Обидва ці продукти безкоштовні, і вони позначають мову, як поліпшений SASсинтаксис GUI (я тільки коли-небудь використовував екран синтаксису в SAS).

Є веб-сайт та пов’язана з ним книга для людей, які переходять із місця SASна місцеR . Я вважав їх корисними для спроб розробити, як перекласти деякі SASкоманди R.

Оновлення: одна річ , яка відвезла мене горіхи , коли підходить до R, що RНЕ бере на себе весь цей набір даних ( data frameв Rпросторіччі), тому що це не статистичний пакет таким чином , що SAS, SPSS, Stata, і т.д .. Так, наприклад, мені знадобився певний час, щоб ifя працював із заявами, тому що я постійно отримував допомогу для ifвисловлювань з векторами (або, можливо, матрицями), тоді як мені потрібна ifзаява, з якою працювали data frames. Отже, сторінки довідки, ймовірно, повинні бути прочитані уважніше, ніж зазвичай, тому що вам потрібно буде перевірити, що команда, яку ви хочете зробити, буде працювати з типом об'єкта даних, який у вас є.

Біт, який все ще зводить мене з розуму при вивченні нової Rкоманди (наприклад, метод аналізу в пакеті, що додається), полягає в тому, що допомога для команд часто не є повністю самостійною. Я перейду на сторінку довідки, щоб спробувати вивчити команду, і замітки про використання, які часто ...містяться в них. Іноді намагання розробити те, що може чи потрібно йти там, де ...є, призвело мене до рекурсивного циклу. Відносна стислість довідкових записок, з SASяких наводяться докладні приклади синтаксису та відпрацьовані приклади з поясненням дослідження на прикладі, була досить великим шоком.


2
+1 Будь ласка, подумайте про оновлення нашої метапотоку, де ми зібрали посилання на статистичні ресурси програмного забезпечення. Є одна відповідь для R та інша для SAS: обидва виграють від посилання на r4stats.com. (Цей потік насправді є частиною нашого FAQ. Ми сподіваємось зберегти його актуальним та корисним.)
whuber

1
R також має пакети, які підтримують доступ до SQL через драйвери RODBC або SQLite.
DWin

1
Я погоджуюся з вашими коментарями щодо допомоги R. Я фактично вказав на те, що ви говорите в одному зі списків розсилки R багато років тому. Відповідь не була позитивною. Чесно кажучи, я (а), ймовірно, не дуже добре себе висловив і не наводив конкретних прикладів, і (b) не займався цим питанням. Підводячи підсумок, проблема 1 є дуже складними прикладами і передбачає занадто багато непов'язаних понять. Складні приклади добре, але слід слідувати простим прикладам. Проблема 2 полягає в тому, що майже немає анотації чи пояснення того, що роблять приклади.
Faheem Mitha

Щодо R "допомоги" нагадує про те, що сказав мені мій начальник. "Ви дізнаєтесь R, роблячи це з кимось, хто вже знає R, що сидить поруч з вами за комп'ютером"
ймовірність, що

А для всіх інших є книги та Stack Overflow. Так, вивчити R самостійно досить важко, принаймні, це було для мене.
Мішель

10

R - мова програмування. Він працює не в стовпчиках даних. Він робить все, що ви хочете, щоб це зробити, бо це лише мова програмування, раб для ваших бажань, виражений мовою фігурних дужок і колонок.

Подумайте про це як Fortran або C, але з неявною векторизацією, тому вам не доведеться перебирати масиви та динамічне управління пам’яттю, щоб вам не довелося ніколи промальовувати () або оголошувати розміри масивів.

Він здебільшого робить всю свою роботу в пам’яті, але якщо ви хочете прочитати частину файлу в ньому, ввімкніть його, а потім виплюнете деякі результати, і прочитайте наступний шматочок, ну ви продовжуєте і пишете програму R, яка робить це.

Ви суперечите собі, кажучи, що модель обчислювально інтенсивна, але SAS повільний через введення / виведення ... Одне чи інше напевно ...

Якщо у вас вже є щось подібне у Фортран, і ви говорите, що хочете відійти від мови інтерпретації, то чому б не зробити це також у Фортран?

Компілятор R може спричинити певні прискорення, але якщо ваш R-код все одно добре написаний, ви не отримаєте нічого занадто масового - не так, як писати це на C або Fortran.


Ах, я не пояснив себе добре. Це інтенсивно в маніпулюванні наборами даних, що в SAS означає занадто багато часу, витраченого на введення-виведення. Моя початкова пропозиція була Fortran, але PI зацікавлений у тому, щоб ми перейшли на R, тому він хотів, щоб я перевірив це. Спасибі!
Меліса

7

Я розумію, що за замовчуванням SAS може працювати з моделями, які перевищують об'єм пам'яті, але це не так з R, якщо ви спеціально не використовуєте пакети, такі як biglm або ff.

Однак, якщо ви виконуєте роботу масиву в R, яку можна векторизувати, це буде дуже швидко - можливо, половина швидкості програми C в деяких випадках, але якщо ви робите щось, що не може бути векторизованим, то це здасться цілком повільний. Щоб навести приклад:

# create a data.frame with 4 columns of standard normally distributed RVs
N <- 10000

# test 1
system.time( {df1 <- data.frame(h1=rnorm(N),
                h2=rpois(N, lambda=5),
                h3=runif(N),
                h4=rexp(N))
} )
# about 0.003 seconds elapsed time

# vectorised sum of columns 1 to 4
# i.e. it can work on an entire column all at once
# test 2
system.time( { df1$rowtotal1 <- df1$h1 + df1$h2 + df1$h3 + df1$h4 })
# about 0.001 seconds elapsed time

# test 3
# another version of the vectorised sum
system.time( { df1$rowtotal2 <- rowSums(df1[,c(1:4)]) })
# about 0.001 seconds elapsed time

# test 4
# using a loop... THIS IS *VERY* SLOW AND GENERALLY A BAD IDEA!!! :-)
system.time( {
        for(i in 1:nrow(df1)) {
                df1$rowtotal3 <- df1[i,1]+ df1[i,2] + df1[i,3] + df1[i,4]
        }
} )
# about 9.2 seconds elapsed time

Коли я збільшив N в десятки до 100 000, я відмовився від тесту 4 через 20 хвилин, але тести 1: 3 займали 61, 3 і 37 мілі - секунди кожен

Для N = 10 000 000 час для тестів 1: 3 становить 3,3s, 0,6s та 1,6s

Зауважте, що це було зроблено на ноутбуці i7 та на 480 Мб за N = 10 мільйонів, пам'ять не була проблемою.

Для користувачів у 32-розрядних вікнах є обмеження на 1,5 Гб оперативної пам'яті для R незалежно від того, скільки пам'яті у вас є, але для 64-бітних вікон або 64-бітного Linux немає такого обмеження. Ці дні пам’яті дуже дешеві порівняно з вартістю години мого часу, тому я просто купую більше пам’яті, а не витрачаю час на те, щоб обійти це. Але це передбачає, що ваша модель поміститься в пам'яті.


1
(+1) Дякую за пропозицію корисних ілюстрацій, Шон!
whuber

3

(2), в ідеалі ми хотіли б створити виконуваний файл, але R зазвичай використовується як сценарій мови

Так, і це є вагомою причиною переходу до Р. Інтерес написання пакету R полягає в тому, щоб дозволити користувачам легко змусити ваші функції взаємодіяти з іншими інструментами, що надаються R, наприклад, подаючи їм завантажені дані ... або все, що вони хочуть. Якщо ви не вважаєте, що це важливо, дотримуйтесь C / C ++ або вашої улюбленої компільованої мови.

Я хочу додати застереження: ви вже програміст, навчання R буде легко і швидко; навчитися ефективному програмуванню R буде довше. Оскільки R інтерпретується, константи приховані вО()асимптотичної складності може бути величезним або невеликим ... наприклад, якщо ви зацікавлені в запуску ваших даних, ви будете використовувати rle(), це буде швидко (його попередньо складена функція). Якщо ви скриптуєте абсолютно той самий алгоритм, він буде повільним (він буде інтерпретований). Це основний приклад: у вас є багато хитрощів з використанням векторних та матриць, щоб уникнути інтерпретованих циклів і змусити попередньо складені функції виконувати всю роботу.

Тож будьте дуже обережні. Після ваших перших спроб у вас неодмінно виникне огида до R, оскільки ви виявите це повільним, із дивним синтаксисом і т. Д. Після того, як ви це зрозумієте, це може бути дуже ефективним інструментом. Ви навіть можете закінчитись, написавши свої методи в R як попередній етап кодування C / C ++. Останнім етапом буде вивчення API R для створення попередньо складених функцій, і ви будете майстром R :)


2

Маніпулювання масивом в пам'яті - очевидно, велика річ для SAS. Я не знаю специфіки щодо R, але я гадаю, що R працює в пам'яті за замовчуванням, оскільки пам'ять, що розширює пакети для R, ff та bigmemory, переміщує дані з пам'яті на диск. Я маю на вас покажчики, якщо ви хочете покращити швидкість або використання пам'яті. Для підвищення швидкості спочатку потрібно використовувати R за призначенням, тобто: векторизувати свій код і використовувати компіляцію байтового коду. (Також: уникайте операцій з копіюванням пам'яті якнайбільше.) По-друге, використовуйте наданий профайлер коду Rprof () для ідентифікації повільних патчів у вашому коді та перепишіть їх на C або C ++, якщо це потрібно. Якщо вам потрібно більше пам’яті, ви можете використовувати аргумент пропуску у функції read.table (), щоб прочитати у ваших даних шматок одночасно, а також ви можете використовувати такий пакет, як RMySQL, який додає у R. утиліти для управління базами даних. Якщо вам потрібно ще більше пам'яті і ви можете дозволити собі супутнє зниження швидкості, ви можете використовувати сніговий пакет для запуску R паралельно. (Докладні відомості про це та багато іншого ви можете знайти у книзі "Мистецтво програмування R" Нормана Матлоффа, опублікованій наприкінці минулого року. Детальну інформацію про упаковки, згадані тут, можна знайти в Інтернеті.)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.