Проблема в том, что вы не можете загрузить все данные в память. Таким образом, вы можете делать выборку данных, как указано ранее в @Marek. На таких огромных наборах данных вы получаете практически те же результаты, даже если вы берете только 1% данных. Для скрипичного сюжета это даст вам достойную оценку плотности. Прогрессивный расчет квантилей невозможен, но это должно дать очень приличное приближение. Это по существу то же самое, что и «рандомизированный метод», описанный в ссылке @aix.
Если вы не можете подмножить дату вне R, это можно сделать, используя соединения в сочетании с sample()
. Следующей функцией является то, что я использую для отбора данных из фрейма данных в текстовом формате, когда он становится слишком большим. Если вы немного поиграете с соединением, вы можете легко преобразовать его в socketConnection или другое, чтобы прочитать его с сервера, базы данных, что угодно. Просто убедитесь, что вы открываете соединение в правильном режиме.
Хорошо, сделайте простой.CSV файл, а затем следующие образцы функций доля р данных:
sample.df <- function(f,n=10000,split=",",p=0.1){
con <- file(f,open="rt",)
on.exit(close(con,type="rt"))
y <- data.frame()
#read header
x <- character(0)
while(length(x)==0){
x <- strsplit(readLines(con,n=1),split)[[1]]
}
Names <- x
#read and process data
repeat{
x <- tryCatch(read.table(con,nrows=n,sep=split),error = function(e) NULL)
if(is.null(x)) {break}
names(x) <- Names
nn <- nrow(x)
id <- sample(1:nn,round(nn*p))
y <- rbind(y,x[id,])
}
rownames(y) <- NULL
return(y)
}
Пример использования:
#Make a file
Df <- data.frame(
X1=1:10000,
X2=1:10000,
X3=rep(letters[1:10],1000)
)
write.csv(Df,file="test.txt",row.names=F,quote=F)
# n is number of lines to be read at once, p is the fraction to sample
DF2 <- sample.df("test.txt",n=1000,p=0.2)
str(DF2)
#clean up
unlink("test.txt")
Что именно означает «очень большой» в вашем случае? – radek 2010-12-03 11:55:39
@radek: «Все данные не могут быть помещены в память», похоже на хорошее приближение «слишком большого для обработки R». Является ли это 2Gb или 20Gb больше не имеет значения, не так ли? – 2010-12-03 14:23:46
@ Joris Если OP не имеет memory.limit слишком мало или много ненужных столбцов или что-то еще. Эта информация может быть актуальной. – Marek 2010-12-03 16:38:15