Какое оборудование ограничивает скорость печати в R? - PullRequest
13 голосов
/ 03 декабря 2011

Я хотел бы увеличить скорость прорисовки, и я доволен (и имею много кода, требующего) пакетов R graphics и ggplot - поэтому меня интересует только то, как я могу настроить свою систему для ускорения прорисовки,

В частности:

  1. Ограничена ли скорость прорисовки в R процессором, памятью, видеокартой?
  2. Существуют ли конкретные аппаратные компоненты или конфигурации, которые могут увеличить скорость печати?

Обновление: ответы на вопросы в комментариях:

характеристики: Ubuntu 11.04, intelCore Duo, 8 ГБ ОЗУ, но меня больше интересует, насколько графические вычисления или графический рендеринг ограничивают, и если да, то как я могу использовать эту информацию.

На моих графиках много объектов, но японятия не имею, какова вычислительная стоимость построения.Я не делаю никаких конкретных анализов при построении графиков (я строю графики после завершения любых необходимых анализов), хотя я понимаю, что некоторые из них выполняются «на лету», как при построении сглаженной линии или даже переводе данных в местоположения.

Ответы [ 2 ]

9 голосов
/ 03 декабря 2011

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

Есть много способов зарегистрировать параллельный бэкэнд, поэтому я не буду вдаваться в подробности. См., Например, эту виньетку: http://cran.r -project.org / web / packages / doSMP / vignettes / gettingstartedSMP.pdf

Затем проверьте функцию ddply в пакете plyr Хэдли и используйте опцию .parallel = TRUE. Это в основном это. Тогда просто делай заговор нормально.

Вот отдельный пример:

#this is the particular library I chose to register a parallel backend. There are others. See the new "Parallel R" book for details.
library(doMC)
registerDoMC()
getDoParWorkers() #This lists how many workers you have (hopefully more than 1!)

library(ggplot2)
ddply(
        mtcars, .variables = "vs", .fun = function(x) {
        #do your plotting now 
        example_plot <- ggplot(x, aes(y = mpg, x = wt)) + geom_point() + geom_smooth(se = FALSE)
        #save your plot
        ggsave(paste(x$vs[1],".pdf",sep = ""), example_plot)
        },
        .parallel = TRUE
)

Это сохранит два файла, 0.pdf и 1.pdf, которые являются уровнями (то есть уникальными значениями) переменной vs кадра данных mtcars. Если вы разбили его на переменную country name, то сохраненными файлами будут названия стран. 0.pdf и 1.pdf как показано ниже:

enter image description here

enter image description here

4 голосов
/ 03 декабря 2011

Как указывает @Xu Wang, вы можете использовать распараллеливание для рисования нескольких графиков одновременно.

Таким образом, с точки зрения аппаратного обеспечения, мощная быстрая многоядерная машина с большим количеством оперативной памяти может помочь.

Если вы хотите построить один график с, скажем, 1 миллионом кругов на графике xy (точечный график), то аппаратное ускорение графики будет очень полезным.

Но быстрая графическая карта помогает только в том случае, еслиграфические устройства в R поддерживают аппаратное ускорение.В настоящее время они этого не делают - и, как указывает @hadley, ggplot использует стандартные графические устройства.

Пакет rgl, очевидно, использует OpenGL для создания 3D-графики.Хотя не пробовал.Возможно, вы сможете использовать его для более эффективного рисования некоторых графиков ...

У меня есть некоторый опыт создания быстрых интерактивных графиков с аппаратным ускорением (2d и 3d), и это может быть на много быстрее.2D-графики на самом деле сложнее разогнать, чем 3D-графики ... Вероятно, нелегко подключиться к современной концепции графического устройства R.

ОБНОВЛЕНИЕ Я только что попробовал rgl и его plot3d с 1 миллионом очков.Он полностью интерактивен (небольшие доли секунды для обновления) на моем (довольно мощном) ноутбуке.

library(rgl)
x <- sort(rnorm(1e6))
y <- rnorm(1e6)
z <- rnorm(1e6) + atan2(x,y)
plot3d(x, y, z, col=rainbow(1000))
...