R + ggplot2 - Невозможно выделить вектор размером 128,0 Мб - PullRequest
2 голосов
/ 01 июня 2011

У меня есть файл размером 4,5 МБ (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, чтобы увидеть процентное соотношение между ними (например, с 20% столбца 1, каков процент, достигнутый в столбце 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 Мб».Я использую 32-битную версию R на машине с Linux и у меня около 4 ГБ свободной памяти.

Я подумал об обходном пути, который заключается в снижении точности этих значений (путем их округления) и устранении дублирующих строк, так чточто у меня меньше строк в наборе данных.Не могли бы вы дать мне несколько советов, как это сделать?

1 Ответ

12 голосов
/ 01 июня 2011

Вы уверены, что у вас есть 9 миллионов строк в файле размером 4,5 МБ ( изменить : возможно, ваш файл имеет размер 4,5 ГБ ??)? Он должен быть сильно сжат - когда я создаю файл размером в одну десятую, его размер составляет 115 МБ ...

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 / grid графику, которая сохраняет полный графический объект и затем отображает его
  • с использованием растровой или растровой графики (PNG и т. Д.), Которая записывает только состояние каждого пикселя в изображении, а не векторная графика, которая сохраняет все объекты независимо от того, перекрываются они или нет
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...