'calloc' не может выделить память с помощью функции stat_smooth - PullRequest
0 голосов
/ 10 июля 2019

Я использую функцию stat_smooth () в ggplot для отображения больших наборов данных. Работает нормально, пока у меня не более 100 000 строк. Затем возвращается ошибка:

«Calloc» не удалось выделить память (18446744073673801728 из 8 байт)

Я работаю на сервере с 48 ГБ и смотрю диспетчер задач. У меня все еще есть доступная память.

Был похожий вопрос из функции ctree (): «Calloc не удалось выделить память» в 64-битном R

Моя проблема связана с ограничением в stat_smooth () или ggplot ()? Кто-нибудь еще пытался запустить большие наборы данных в любой функции? У вас есть такая же проблема или у вас был успех?

1 Ответ

0 голосов
/ 10 июля 2019

Я нашел это у Денниса Мерфи на другом форуме (https://groups.google.com/forum/#!topic/ggplot2/enavD18MmkY):

Привет:

Чтобы расширить комментарии Хэдли, я бы посоветовал вам обратиться к Лёссу и прочитать главу вБелая книга, на которую она ссылается, чтобы лучше понять, как работает процедура лесса, не имеет смысла для меня, почему нужно использовать интервал 1, чтобы соответствовать модели лесса с наблюдениями 40K.

По своейnature, loess - это алгоритм «локальной регрессии» с акцентом на «local». Аргумент span контролирует пропорцию данных, которая должна использоваться для получения каждого локального соответствия - чем шире диапазон, тем сглаживается функция соответствия.Если вы внимательно посмотрите на сам алгоритм, вы обнаружите, что он ОЧЕНЬ интенсивно использует память, поэтому, если вы настаиваете на подборе лесса с большим размером выборки, по крайней мере, уменьшите диапазон. Вот пример, чтобы проиллюстрировать, что вы действительно можете уместитьМодель лёсса в ggplot2 с 40K наблюдениями.

x <- seq(0, 100, length.out = 40000) 
# A periodic function 
DF <- data.frame(x = x, y = 1 + sin(x) + 0.5 * cos(2 * x) + rnorm(40000)) 

library(ggplot2) 

# Uses the default "auto" method to which Hadley referred: 
ggplot(DF, aes(x = x, y = y)) + 
   geom_point(alpha = 0.05, shape = 21) + 
   geom_smooth(size = 1) 

Результат этого [gam] соответствия, который завершает rathБыстро, более или менее эквивалентно модели Лесса с большим пролетом (например, 1), но гораздо более вычислительно эффективен.Периодичность почти полностью игнорируется в подобранной кривой, так как она была усреднена.Чтобы зафиксировать периодичность с помощью алгоритма локальной регрессии, вам необходимо уменьшить долю данных, предназначенных для каждого локального соответствия.Следующий вызов занимает примерно 1,5-2 минуты (предположительно), но на моем ноутбуке он в конце концов подходит к лессовой нагрузке (с 12 ГБ ОЗУ + 64-битная микросхема R-3.2.0 + i7):

ggplot(DF, aes(x = x, y = y)) + 
   geom_point(alpha = 0.05, shape = 21) + 
   geom_smooth(method = "loess", span = 0.1, size = 1) 

Когда я запустил это в графическом интерфейсе R, я получил сообщение «Не отвечает», когда R сильно удалялся, но в конце концов график все же появился.

Вы должны быть в состоянии получить более точную локальную подгонку, дополнительно уменьшив диапазон, поскольку в этом примере span = 0.1 означает, что он использует приблизительно 4000 точек для локальной подгонки, что намного больше, чем требуется дляКривая это просто по форме.Следующий вызов занял около 8-10 секунд, с одним отличием в спецификации:

ggplot(DF, aes(x = x, y = y)) + 
   geom_point(alpha = 0.05, shape = 21) + 
   geom_smooth(method = "loess", span = 0.005, size = 1) 

В этом вызове span = 0.005 означает, что в каждом локальном подборе используется приблизительно 200 наблюдений, что все еще довольно велико.,Я бы порекомендовал поэкспериментировать с немного меньшими и большими пролетами, чтобы увидеть, как это влияет на подобранную модель лесса.Выбор диапазона должен основываться на количестве строк во фрейме входных данных, форме функции ввода с шумом и желаемой степени гладкости.

Пример был преднамеренно выбран, чтобы проиллюстрировать, почему выбор пролета имеет значение для лесса.С другой стороны, полученное вами сообщение об ошибке косвенно указывает на то, что loess - это проблема с памятью, и вам нужно знать достаточно о том, как он работает как алгоритм, чтобы продуктивно использовать его.

Деннис

Когда я уменьшаю значение диапазона, мой код выполняется без ошибок.Даже с размахом 0,1 мой последний сет занял 2 часа.Я попытался с диапазоном 0,01 и получил ошибку, чтобы увеличить мой диапазон.

...