R + ggplot2 - 无法分配大小为128.0 Mb的向量

Bar*_*ata 2 r ggplot2

我有一个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
Run Code Online (Sandbox Code Playgroud)

在每列中,值表示从0到100的值,表示百分比.我的目标是在ggplot2中绘制一个图形以查看它们之间的百分比(例如,使用第1列的20%,第2列实现的百分比是多少).Heres是我的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")
Run Code Online (Sandbox Code Playgroud)

我遇到了问题,因为每次运行此R都会耗尽内存,从而出现错误:"无法分配大小为128.0 Mb的向量".我在Linux机器上运行32位R,我有大约4GB的可用内存.

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

Ben*_*ker 12

你确定4.5MB文件中有900万行(编辑:也许你的文件是4.5 GB ??)?它必须大量压缩 - 当我创建一个十分之一的文件时,它是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"]
Run Code Online (Sandbox Code Playgroud)

很难从你给出的信息中看出你的数据集中有什么样的"重复行"...... unique(dataset)只会提取唯一的行,但这可能没用.我可能首先简单地将数据集稀疏100或1000倍:

smdata <- dataset[seq(1,nrow(dataset),by=1000),]
Run Code Online (Sandbox Code Playgroud)

并看看它是如何从那里发展的.(编辑:忘了逗号!)

大数据集的图形表示通常是一个挑战.一般来说,你会更好:

  • 在绘制之前以某种方式总结数据
  • 使用专门的图形类型(密度图,轮廓,六边形分级)来减少数据
  • 使用基本图形,使用"绘图和遗忘"模型(除非打开图形记录,例如在Windows中),而不是格子/ ggplot /网格图形,它保存完整的图形对象,然后渲染它
  • 使用光栅或位图图形(PNG等),它只记录图像中每个像素的状态,而不是矢量图形,它保存所有对象是否重叠