Salvando um quadro de dados como um arquivo binário
-
06-07-2019 - |
Pergunta
Eu gostaria de salvar um monte de relativamente grandes quadros de dados e minimizar o espaço que os arquivos ocupam. Ao abrir os arquivos, eu preciso ser capaz de controlar o que os nomes são dados no espaço de trabalho.
Basicamente eu estou olhando para os symantics de dput e DGET mas com arquivos binários.
Exemplo:
n<-10000
for(i in 1:100){
dat<-data.frame(a=rep(c("Item 1","Item 2"),n/2),b=rnorm(n),
c=rnorm(n),d=rnorm(n),e=rnorm(n))
dput(dat,paste("data",i,sep=""))
}
##much later
##extract 3 random data sets and bind them
for(i in 1:10){
nums<-sample(1:100,3)
comb<-rbind(dget(paste("data",nums[1],sep="")),
dget(paste("data",nums[2],sep="")),
dget(paste("data",nums[3],sep="")))
##do stuff here
}
Solução
Sua melhor aposta é usar arquivos rda. Você pode usar os comandos save()
e load()
para escrever e ler:
set.seed(101)
a = data.frame(x1=runif(10), x2=runif(10), x3=runif(10))
save(a, file="test.rda")
load("test.rda")
Editar: Para completar, apenas para cobrir o que a sugestão de Harlan pode parecer (ou seja, envolvendo o comando de carregamento para retornar o quadro de dados):
loadx <- function(x, file) {
load(file)
return(x)
}
loadx(a, "test.rda")
Como alternativa, ter um olhar para o hdf5, RNetCDF e pacotes ncdf. Eu experimentei com o hdf5 pacote no passado; Isto usa a biblioteca NCSA HDF5 . É muito simples:
hdf5save(fileout, ...)
hdf5load(file, load = TRUE, verbosity = 0, tidy = FALSE)
A última opção é a utilização de conexões de arquivos binários, mas isso não vai funcionar bem no seu caso, porque readBin e writeBin só suportam vetores:
Aqui está um exemplo trivial. Primeiro escrever alguns dados com "w" e acrescentar "b" para a conexão:
zz <- file("testbin", "wb")
writeBin(1:10, zz)
close(zz)
Em seguida, ler os dados com "r" e acrescentar "b" para a conexão:
zz <- file("testbin", "rb")
readBin(zz, integer(), 4)
close(zz)
Outras dicas
Você pode ter um olhar para saveRDS
e readRDS
. Eles são funções para serialização.
x = data.frame(x1=runif(10), x2=runif(10), x3=runif(10))
saveRDS(x, file="myDataFile.rds")
x <- readRDS(file="myDataFile.rds")