Проблема в том, что вы не можете загрузить все данные в память. Таким образом, вы можете сделать выборку данных, как указано ранее @Marek. На таких огромных наборах данных вы получаете практически одинаковые результаты, даже если вы берете только 1% данных. Для скрипичного сюжета это даст вам достойную оценку плотности. Прогрессивный расчет квантилей невозможен, но это должно дать очень приличное приближение. По сути, это то же самое, что «рандомизированный метод», описанный в ссылке, которую дал @aix.
Если вы не можете установить дату вне R, это можно сделать, используя соединения в сочетании с sample()
. Следующая функция - это то, что я использую для выборки данных из кадра данных в текстовом формате, когда он становится слишком большим. Если вы немного поиграете с соединением, вы можете легко преобразовать это в socketConnection или другое, чтобы прочитать его с сервера, из базы данных, что угодно. Просто убедитесь, что вы открываете соединение в правильном режиме.
Хорошо, возьмите простой файл .csv, затем следующая функция выбирает часть p данных:
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")