【问题标题】:R + ggplot2 - Cannot allocate vector of size 128.0 MbR + ggplot2 - 无法分配大小为 128.0 Mb 的向量
【发布时间】:2011-09-06 02:41:56
【问题描述】:

我有一个 4.5MB(9,223,136 行)的文件,其中包含以下信息:

0       0
0.0147938       3.67598e-07
0.0226194       7.35196e-07
0.0283794       1.10279e-06
0.033576        1.47039e-06
0.0383903       1.83799e-06
0.0424806       2.20559e-06
0.0465545       2.57319e-06
0.0499759       2.94079e-06

在每一列中,一个值表示一个从 0 到 100 的值,表示百分比。我的目标是在 ggplot2 中绘制一个图形以查看它们之间的百分比(例如,对于 column1 的 20%,column2 的百分比是多少)。这是我的 R 脚本:

library(ggplot2)
dataset=read.table("~/R/datasets/cumul.txt.gz")
p <- ggplot(dataset,aes(V2,V1))
p <- p + geom_line()
p <- p + scale_x_continuous(formatter="percent") + scale_y_continuous(formatter="percent")
p <- p + theme_bw()
ggsave("~/R/grafs/cumul.png")

我遇到了一个问题,因为每次我运行这个 R 时都会耗尽内存,并给出错误:“无法分配大小为 128.0 Mb 的向量”。我在 Linux 机器上运行 32 位 R,我有大约 4GB 的可用内存。

我想到了一种解决方法,包括降低这些值的精度(通过四舍五入)并消除重复的行,以便我在数据集上的行更少。你能给我一些关于如何做到这一点的建议吗?

【问题讨论】:

  • 您的工作区中还有其他对象吗?当这种情况发生在我身上时,我通常会保存我需要的对象,然后使用干净的工作区重新启动。如果您删除不需要的对象,调用 gc() 也可能会有所帮助。
  • @richie 我开始一个干净的 R 会话,只调用这个脚本:/usr/bin/R CMD BATCH --vanilla --no-timing ~/scripts/R/grafs/cumul.R ~/R/scripts_output/cumul.txt
  • 脚本是只创建上面的例子还是创建更多的对象?
  • @richiemorrisroe 我尝试在 8GB RAM、64-Win 上运行它(使用虚拟数据和干净的工作区)。当我杀死它时,进程达到 6GB。所以唯一的办法就是限制数据的大小。

标签: r ggplot2


【解决方案1】:

您确定在一个 4.5MB 的文件中有 900 万行吗(编辑:也许您的文件是 4.5GB??)?它必须被高度压缩——当我创建一个大小为十分之一的文件时,它是 115Mb ...

n <- 9e5
set.seed(1001)
z <- rnorm(9e5)
z <- cumsum(z)/sum(z)
d <- data.frame(V1=seq(0,1,length=n),V2=z)
ff <- gzfile("lgfile2.gz", "w")
write.table(d,row.names=FALSE,col.names=FALSE,file=ff)
close(ff)
file.info("lgfile2.gz")["size"]

从您提供的信息中很难判断您的数据集中有哪些类型的“重复行”...unique(dataset) 将仅提取唯一行,但这可能没有用。我可能会从简单地将数据集稀释 100 或 1000 倍开始:

smdata <- dataset[seq(1,nrow(dataset),by=1000),]

看看它是如何从那里开始的。 (编辑:忘记逗号!)

大型数据集的图形表示通常是一项挑战。一般来说,你会过得更好:

  • 在绘制数据之前以某种方式汇总数据
  • 使用专门的图形类型(密度图、等高线、六边形分箱)来减少数据
  • 使用基本图形,它使用“绘制并忘记”模型(除非图形记录已打开,例如在 Windows 中),而不是 lattice/ggplot/grid 图形,后者保存完整的图形对象然后渲染它李>
  • 使用光栅或位图图形(PNG 等),它只记录图像中每个像素的状态,而不是矢量图,它保存所有对象,无论它们是否重叠

【讨论】:

  • 你的前两点是最重要的(并且是等价的)——如果你适当地总结数据,base vs. grid 的绘制速度将不重要。
  • @hadley:很公平。从初学者的角度来看,黑盒机在一步中汇总和绘制数据(适当使用sum_stat()plot(density(x)) 等)与必须自己进行汇总之间可能存在差异。我同意,从长远来看,找到汇总数据的方法会更优雅,更有效,尽管在短期内考虑 #3 和 #4 可能很有用。
猜你喜欢
  • 1970-01-01
  • 2021-08-31
  • 2015-10-25
  • 2019-04-04
  • 2019-02-04
相关资源
最近更新 更多