transfert de données de Access vers data frame

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Lassana Koita
Messages : 68
Enregistré le : 13 Fév 2007, 11:38

transfert de données de Access vers data frame

Messagepar Lassana Koita » 02 Aoû 2007, 07:28

Bonjour chers utilisateurs de R,

J'ai voulu transférer mes donnees Access vers un data frame, d'abord j'ai mis trop de temps à attendre (ce qui m'a déjà inquiété) ensuite ce message d'erreur ci-dessous est apparu.
C'est un fichier de près de 540 000 lignes. L'erreur signifie-t-elle que R est incapable de traiter ce fichier?
Avez-vous une idée de ce que ça peut être ou des indications à me donner?

Merci

> library(RODBC)
>
> db <- "D:/Donnees_expertise/IG2004_modif.mdb"
> channel <- odbcConnectAccess(db)
> mydata <- sqlFetch(
+ channel = channel,
+ sqtable = "SURVOLS_IGMP_2004_avec 2005"
+ )
Erreur : impossible d'allouer un vecteur de taille 4.0 Mo
De plus : Warning messages:
1: Reached total allocation of 509Mb: see help(memory.size) in: data[, i] %in% na.strings
2: Reached total allocation of 509Mb: see help(memory.size) in: data[, i] %in% na.strings
3: Reached total allocation of 509Mb: see help(memory.size) in: data[, i] %in% na.strings
4: Reached total allocation of 509Mb: see help(memory.size) in: data[, i] %in% na.strings
> mydata

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 02 Aoû 2007, 08:10

Cela dépend de la RAM disponible. Je viens de faire l'expérience avec une base que j'ai sous la main:

Code : Tout sélectionner

> library(RODBC)
> canal <- odbcConnectAccess("d:/baobab/baobab2000.mdb")
> system.time(tab <- sqlQuery(canal, "select * from datemesu"))
utilisateur     système      écoulé
      33.34        0.98       34.44
> odbcCloseAll()
> dim(tab)
[1] 639092      5


(j'ai 1 Go de RAM, avec un processeur à 1.73 GHz).

Vous pouvez essayer avec sqlQuery (comme ci-dessus) au lieu de sqlFetch, en sélectionnant dans votre requête SQL uniquement les colonnes (voire les lignes) dont vous avez besoin: cela limitera la mémoire nécessaire. C'est d'ailleurs un des gros intérêts de stocker les données dans une base externe: n'extraire que les infos nécessaires.

Renaud

Lassana Koita
Messages : 68
Enregistré le : 13 Fév 2007, 11:38

Messagepar Lassana Koita » 02 Aoû 2007, 09:24

Merci Renaud de votre réponse, mais j'ai toujours un souci; elle ne prend pas en compte ma table: temps ecoulé =0 , dim = NULL

library(RODBC)
>
> channel <- odbcConnectAccess("D:/Donnees_expertise/IG2004_modif.mdb")
> sqlTables(channel)
TABLE_CAT TABLE_SCHEM
1 D:\\Donnees_ expertise\\IG2004_modif <NA>
2 D:\\Donnees_ expertise\\IG2004_modif <NA>
3 D:\\Donnees_ expertise\\IG2004_modif <NA>
4 D:\\Donnees_ expertise\\IG2004_modif <NA>
5 D:\\Donnees_ expertise\\IG2004_modif <NA>
6 D:\\Donnees_ expertise\\IG2004_modif <NA>
7 D:\\Donnees_ expertise\\IG2004_modif <NA>
8 D:\\Donnees_ expertise\\IG2004_modif <NA>
9 D:\\Donnees_ expertise\\IG2004_modif <NA>
TABLE_NAME TABLE_TYPE REMARKS
1 MSysAccessObjects SYSTEM TABLE <NA>
2 MSysACEs SYSTEM TABLE <NA>
3 MSysObjects SYSTEM TABLE <NA>
4 MSysQueries SYSTEM TABLE <NA>
5 MSysRelationships SYSTEM TABLE <NA>
6 SURVOLS_IGMP_2004 TABLE <NA>
7 SURVOLS_IGMP_2004_avec 2005 TABLE <NA>
8 2004-2005 type A320 CFM56-5A1 VIEW <NA>
9 IMG2004-2005 typeA320 VIEW <NA>
> system.time(tab <- sqlQuery(channel, "select*from SURVOLS_IGMP_2004_avec 2005")) utilisateur système écoulé
0 0 0
>
> odbcCloseAll()
> dim(tab)
NULL
>

Pierre Bady
Messages : 405
Enregistré le : 02 Mai 2006, 07:46

Messagepar Pierre Bady » 02 Aoû 2007, 09:38

bonjour,


c'est peut-etre à cause du nom de la table :

"SURVOLS_IGMP_2004_avec 2005"

il ya un espace entre "avec" et "2005"


en espérant avoir aidé

@+

pierre
=@===--------¬-------¬------¬-----¬
liens utiles :
http://www.gnurou.org/Writing/SmartQuestionsFr
http://neogrifter.free.fr/welcomeOnInternet.jpg
]<((((*< -------------------------------

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 02 Aoû 2007, 10:26

En plus du conseil de Pierre, vous n'arrangez pas votre pb de mémoire (s'il y en a un) avec cette requête. Avez-vous réellement besoin de ttes les lignes et de ttes les colonnes de la table ? Sinon, votre requête SQL doit être plus restrictive. Si vous ne connaissez pas le langage SQL, "google is your friend"...

Renaud

Aurélien Madouasse
Messages : 352
Enregistré le : 26 Fév 2007, 11:23

Messagepar Aurélien Madouasse » 02 Aoû 2007, 10:57

Une astuce pour obtenir le code SQL consiste a créer la requête dans Access, d'aller dans affichage/SQL et de copier/coller le code dans sqlQuery(channel,"..."). En général ça marche.

Aurélien

Lassana Koita
Messages : 68
Enregistré le : 13 Fév 2007, 11:38

Messagepar Lassana Koita » 05 Aoû 2007, 20:21

Merci de vos suggessions qui m'ont été très précieuses. Comme avait souligné Renaud, je n'ai vraiment pas besoin de sortir toutes les 20 colonnes en même temps; toutefois même si le problème de mémoire est contourné, il demeure.

En outre, le code ci-dessous fonctionne ou non suivant le %. C'est-à-dire,
si je mets % de part et d'autre du nom de la famille d'avions pour éliminer les blancs, j'obtiens dim(mytab)=0 x 8 et boxplot vide (ce qui est faux); d'autre part, en ne mettant pas %, j'obtiens une partie de ce que je veux mais également chaque famille est représentée deux fois dans le boxplot.
A votre avis qu'est ce qui doit être faux dans ce code?
Merci

Voici les deux situations:
1.-
mytab <- sqlQuery(channel,"select type,QFU,mmd,L5000_L9200,Heure_debut, Heure_fin,
depart,arrivee FROM SURVOLS_IGMP WHERE type in ('%A320%', '%A321%','%747%-400%')")
dim(mytab) = 0x8 et boxplot vide

2.- mytab <- sqlQuery(channel,"select type,QFU,mmd,L5000_L9200,Heure_debut, Heure_fin,
depart,arrivee FROM SURVOLS_IGMP WHERE type in ('A320', 'A321','B747-400')")
dim(mytab) = 123748x8 et (chaque faille doublement représentée dans le boxplot)

Merci de votre aide


mytab <- sqlQuery(channel,"select type,QFU,mmd,L5000_L9200,Heure_debut, Heure_fin,
depart,arrivee FROM SURVOLS_IGMP WHERE type in ('%A320%', '%A321%','%B747%-400%')")
dim(mytab)

library(lattice)
bwplot(mytab[,"L5000_L9200"] ~ mytab[,"type"], ylab="L5000_L9200 ",
panel=function(x,y,...)
{

panel.linejoin(x, y, fun = median,col="green",...);
panel.bwplot(x,y, horizontal=FALSE)

}
)


Lassana KOITA

Stéphane Laurent
Messages : 1557
Enregistré le : 05 Déc 2006, 19:07

Messagepar Stéphane Laurent » 07 Aoû 2007, 20:46

Bonjour,

Une suggestion qui vaut ce qu'elle vaut pour contourner le problème avec sqlQuery : d'abord exporter la table Access en Excel, puis la table Excel dans R avec le package xlsReadWrite.

Lassana Koita
Messages : 68
Enregistré le : 13 Fév 2007, 11:38

Messagepar Lassana Koita » 07 Aoû 2007, 23:15

J'ai bien aimé travailler avec MS Excel, seulement le nombre maxi de lignes fourni est 65536. Alors que la base sur laquelle je travaille en possède plus de 540122 et 20 colonne. En un mot MS Excel est limité en ligne. J'ai besoin de toutes les lignes pour une comparaison globale.
Merci de votre suggession

Très cordialement

Lassana KOITA

Nicolas Péru
Messages : 1408
Enregistré le : 07 Aoû 2006, 08:13

Messagepar Nicolas Péru » 08 Aoû 2007, 06:03

je ne suis pas expert en sql et je ne sais pas quelle norme SQL utilise la librairie rodbc mais pour moi le "%" sert à remplacer une chaine de caractère en sql.
Par exemple :

Code : Tout sélectionner

SELECT species
FROM tab
LIKE A%


sélectionne les noms d'espèces commençant par A dans la table tab.

donc c'est peut être là d'ou vient l'erreur.

Ensuite un conseil serait de ne pas mélanger R et sql dans un premier temps si vous ne maitrisez pas bien un des deux voire les deux. Des petits utilitaires sql existent qui comportent des aides pour les requêtes et qui sont très pratique. Pour n'en citer qu'un je dirai phpmyadmin.
Voilà bon courage.

P.S : si vous pouvez aussi, il y a toujours la possibilité d'utiliser la dernère version d'excel qui a un nombre de cellule beaucoup moins limité que les précédente version (quelque chose comme 65000 colonnes, et plusieurs millions de lignes)


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité