'calloc'无法使用stat_smooth函数分配内存

时间:2019-07-10 13:03:07

标签: r ggplot2 calloc

我在ggplot中使用stat_smooth()函数来绘制大型数据集的图形。直到我有超过100,000行,它才能正常工作。然后返回错误:

'Calloc'无法分配内存(18446744073673801728,共8个字节)

我正在使用48 GB的服务器,并且正在看任务管理器,我仍然有可用的内存。

ctree()函数有一个类似的问题: "'Calloc 'could not allocate memory" in 64-bit R

我的问题是由于stat_smooth()或ggplot()的限制引起的吗?是否有其他人试图在任一函数中运行大型数据集?您是否遇到相同的问题或成功?

1 个答案:

答案 0 :(得分:0)

我是在另一个论坛(https://groups.google.com/forum/#!topic/ggplot2/enavD18MmkY)上的丹尼斯·墨菲(Dennis Murphy)那里找到的:

嗨:

为了进一步了解Hadley的评论,建议您咨询 黄土并阅读白皮书中引用的章节以获取 更好地了解黄土程序的运行方式。它没有 对我而言,为什么要使用1的跨度来拟合黄土模型 进行40K次观测

从本质上讲,黄土是一种“局部回归”算法,重点在于 在“本地”。 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]匹配的结果很快完成,效果更好 或等于大跨度(例如1)的黄土模型,但 计算效率更高。周期性几乎 在拟合曲线中,由于已被平均而被完全忽略。 要使用局部回归算法捕获周期性,您需要 减少用于每个局部拟合的数据比例。的 接下来的通话大约需要1.5-2分钟(估计)才能运行,但是 确实会在我的笔记本电脑上最终产生黄土(带有12Gb RAM + R-3.2.0 64位+ 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 GUI中运行此命令时,我收到了“未响应”消息,而 R大步向前,但最终确实出现了图。

您应该能够通过减少 跨度更大,因为在此示例中,跨度= 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个观测值 用于每个局部拟合,但仍然很大。我会 建议尝试使用较小的跨度和较大的跨度来观察 它如何影响拟合的黄土模型。跨度的选择应为 通过输入数据框中的行数得知 嘈杂的输入功能和所需的平滑度。

故意选择该示例以说明为什么选择 在黄土中跨越问题。另一方面,错误信息 间接接收到黄土是一个记忆猪的信号,您需要 足够了解它如何作为算法来使用 富有成效地。

丹尼斯

当我减小跨度值时,我的代码运行没有错误。即使跨度为0.1,我的上一组也要花2个小时才能运行。我尝试使用0.01的跨度,但出现错误以增大我的跨度。