Gracias a todos por los consejos y respuestas, he hecho un poco de resumen y experimento basado en eso.
Consulte una pequeña prueba con una base de datos pública (ESS 2008 in Hungary) a continuación. La base de datos tiene 1508 casos y 508 variables, por lo que podría tratarse de datos medianos. Ese podría ser un buen ejemplo para hacer la prueba (para mí), pero, por supuesto, las necesidades especiales requerirían un experimento con datos adecuados.
La lectura de los datos de SPSS sav archivo sin ninguna modificación:
> system.time(data <- read.spss('ESS_HUN_4.sav'))
user system elapsed
2.214 0.030 2.376
Cargando con un objeto binario convertido:
> save('data',file='ESS_HUN_4.Rdata')
> system.time(data.Rdata <- load('ESS_HUN_4.Rdata'))
user system elapsed
0.28 0.00 0.28
Tratando con csv:
> write.table(data, file="ESS_HUN_4.csv")
> system.time(data.csv <- read.csv('ESS_HUN_4.csv'))
user system elapsed
1.730 0.010 1.824
T inquietante con "afinado" csv carga:
> system.time(data.csv <- read.table('ESS_HUN_4.csv', comment.char="", stringsAsFactors=FALSE, sep=","))
user system elapsed
1.296 0.014 1.362
también con el paquete sqldf, que parece cargar archivos CSV mucho más rápido:
> library(sqldf)
> f <- file("ESS_HUN_4.csv")
> system.time(bigdf <- sqldf("select * from f", dbname = tempfile(), file.format = list(header = T, row.names = F, sep="\t")))
user system elapsed
0.939 0.106 1.071
Y también la carga de los datos de una MySQL base de datos que se ejecuta en localhost:
> library(RMySQL)
> con <- dbConnect(MySQL(), user='root', dbname='test', host='localhost', password='')
> dbWriteTable(con, "data", as.data.frame(data), overwrite = TRUE)
> system.time(data <- dbReadTable(con, 'data'))
user system elapsed
0.583 0.026 1.055
> query <-('SELECT * FROM data')
> system.time(data.sql <- dbGetQuery(con, query))
user system elapsed
0.270 0.020 0.473
Aquí, creo que hay que añadir los dos system.time
re portado, ya que la conexión a los datos también cuenta en nuestro caso. Comente, si entendí mal algo.
Pero veamos si solo se consultan algunas variables, como p. Ej. mientras que el trazado no necesitamos toda la trama de datos en la mayoría de los casos, y la consulta de sólo dos variables es suficiente para crear una bonita parcela de ellos:
> query <-('SELECT c1, c19 FROM data')
> system.time(data.sql <- dbGetQuery(con, query))
user system elapsed
0.030 0.000 0.112
que parece realmente grande! Por supuesto, sólo después de cargar la mesa con dbReadTable
Resumen: nada para vencer la lectura de toda la información del archivo binario, pero la lectura de sólo unas pocas columnas (u otros datos filtrados) de la misma tabla base de datos podría ser también ponderado en algunos casos especiales.
Entorno de prueba: computadora portátil HP 6715b (AMD X2 2Ghz, 4 Gb DDR2) con un SSD de gama baja.
ACTUALIZACIÓN (24/01/2011): He añadido una manera bastante hacker, pero bastante "creativa" de la carga sólo unas pocas columnas de un objeto binario - lo que parece mucho más rápido que cualquier método examinó encima.
Tenga en cuenta: el código se verá muy mal, pero sigue siendo muy eficaz :)
En primer lugar, puedo guardar todas las columnas de una hoja.de.datos en diferentes objetos binarios a través del siguiente bucle:
attach(data)
for (i in 1:length(data)) {
save(list=names(data)[i],file=paste('ESS_HUN_4-', names(data)[i], '.Rdata', sep=''))
}
detach(data)
Y entonces me carga dos columnas de los datos:
> system.time(load('ESS_HUN_4-c19.Rdata')) +
> system.time(load('ESS_HUN_4-c1.Rdata')) +
> system.time(data.c1_c19 <- cbind(c1, c19))
user system elapsed
0.003 0.000 0.002
que se parece a un método "ultrarrápido"! :) Nota: se cargó 100 veces más rápido que el método más rápido (cargando todo el objeto binario) anterior.
He creado un paquete muy pequeño (llamado: saves), mira en github para obtener más detalles si está interesado.
ACTUALIZACIÓN (06/03/2011): una nueva versión de mi pequeño paquete (saves) fue subido a CRAN, en la que es posible guardar y variables de carga aún más rápido - si sólo el usuario solo necesita un subconjunto de las variables disponibles en un marco de datos o lista. Ver el vignette en las fuentes de paquetes de datos o el que está en my homepage, y voy a presentar también un buen diagrama de caja de algún punto de referencia hecho:
Este diagrama de caja muestra el beneficio de usar ahorra paquete para cargar solo un subconjunto de variables contra load
y read.table
o read.csv
de base, read.spss
de paquetes externos o sqldf
o RMySQL
.
Felicitaciones: ¡tiene un caso de negocios para un nuevo SSD brillante! –
@Richie Cotton: tiene razón :) Pero para ser sincero: si ejecuto mis scripts en una máquina con SSD conectado, me gustaría ajustar el código. – daroczig