我有一个 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 中绘制一个图形来检查它们之间的百分比(例如,第 1 列的 20% 是第 2 列达到的百分比)。这是我的 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 的可用内存。
我想到了一种解决方法,包括降低这些值的精度(通过对它们进行四舍五入)并消除重复的行,以便数据集中的行数更少。您能给我一些关于如何做到这一点的建议吗?
您确定 4.5MB 文件中有 900 万行吗(edit:也许你的文件是 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"]
从您提供的信息中很难判断数据集中有什么样的“重复行”......unique(dataset)
将仅提取唯一的行,但这可能没有用。我可能会先简单地将数据集稀疏 100 或 1000 倍:
smdata <- dataset[seq(1,nrow(dataset),by=1000),]
看看接下来的进展如何。 (edit: 忘了逗号!)
大型数据集的图形表示通常是一个挑战。一般来说,你会过得更好:
- 在绘制数据之前以某种方式汇总数据
- 使用专门的图形类型(密度图、等高线、六边形分箱)来减少数据
- 使用基本图形,它使用“绘制并忘记”模型(除非打开图形记录,例如在 Windows 中),而不是点阵/ggplot/网格图形,后者保存完整的图形对象然后渲染它
- 使用光栅或位图图形(PNG等),它只记录图像中每个像素的状态,而不是矢量图形,它保存所有对象,无论它们是否重叠
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)