Merci à vous tous pour les conseils et les réponses, j'ai fait de la synthèse et de l'expérience sur cette base.
Voir un petit test avec une base de données publique (ESS 2008 en Hongrie) ci-dessous. La base de données ont 1508 cas et 508 variables, de sorte qu'il pourrait être une de données de taille moyenne. Cela pourrait être un bon exemple pour faire le test sur (pour moi), mais bien sûr des besoins spéciaux nécessiterait une expérience avec des données adéquates.
La lecture des données à partir de SPSS sav fichier sans aucune modification:
> system.time(data <- read.spss('ESS_HUN_4.sav'))
user system elapsed
2.214 0.030 2.376
Chargement avec un converti objet binaire:
> 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
Essayer avec 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
Essaie avec "affiner" csv chargement:
> system.time(data.csv <- read.table('ESS_HUN_4.csv', comment.char="", stringsAsFactors=FALSE, sep=","))
user system elapsed
1.296 0.014 1.362
Aussi avec le paquet sqldf, qui semble pour charger les fichiers csv beaucoup plus rapide:
> 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
Et également le chargement de données à partir d'une base de données MySQL en cours d'exécution sur 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
Ici, je pense que nous devrions ajouter les deux system.time
signalés, de même que la connexion aux données compte aussi dans notre cas. S'il vous plaît commentaire, si j'ai mal compris quelque chose.
Mais nous allons voir si l'interrogation uniquement certaines variables, comme par exemple. alors qu'elle préparait nous n'avons pas besoin de tous les dataframe dans la plupart des cas, l'interrogation et le seulement deux variables est suffisant pour créer un beau terrain d'entre eux:
> query <-('SELECT c1, c19 FROM data')
> system.time(data.sql <- dbGetQuery(con, query))
user system elapsed
0.030 0.000 0.112
Ce qui semble vraiment super! Bien sûr, juste après le chargement de la table avec dbReadTable
Résumé: rien à battre lecture de l'ensemble de données à partir d'un fichier binaire, mais la lecture de seulement quelques colonnes (ou d'autres données filtrées) à partir de la même table de base de données pourrait également être pondéré dans certains cas particuliers.
Environnement de Test: HP 6715b ordinateur portable (AMD X2 2 ghz, 4 Go de mémoire DDR2) avec un bas de gamme de SSD.
Mise à JOUR (24/01/2011): j'ai ajouté un plus à du bidouillage, mais très "créatif" moyen de chargement de seulement quelques colonnes d'un objet binaire - qui semble beaucoup plus rapide que n'importe quelle méthode examiné ci-dessus.
Attention: le code est vraiment mauvais, mais toujours très efficace :)
Tout d'abord, j'ai enregistrer toutes les colonnes de données.cadre en différents objets binaires via la boucle suivante:
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)
Puis-je charger des deux colonnes de données:
> 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
Qui ressemble à un "superfast" la méthode! :- ) Note: il a été chargé à 100 fois plus rapide que le plus rapide (chargement de l'ensemble de l'objet binaire) la méthode ci-dessus.
J'ai fait un très petit paquet (nommé: sauve), regardez dans github pour plus de détails si vous êtes intéressé.
Mise à JOUR (06/03/2011): une nouvelle version de mon petit paquet (sauve) a été transféré à CRAN, dans lequel il est possible d'enregistrer et de charger des variables encore plus rapide - si et seulement si l'utilisateur n'a besoin que d'un sous-ensemble des variables disponibles dans une trame de données ou liste. Voir la vignette dans le package des sources pour plus de détails sur ma page d'accueil, et laissez-moi vous présenter aussi une belle boîte à moustaches de certains de référence fait:
Cette boîte à moustaches montre les avantages de l'utilisation sauve colis à charger uniquement un sous-ensemble de variables à l'encontre load
et read.table
ou read.csv
à partir de la base, read.spss
d'étrangers ou d' sqldf
ou RMySQL
des paquets.