IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

R Discussion :

Utilisation de read.big.matrix()


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 9
    Par défaut Utilisation de read.big.matrix()
    Bonjour,

    Je dois travailler sur une très grosse base de données. Il m'est bien sûr impossible de la charger directement avec un simple read.csv en raison d'un problème d'allocation de buffer. On effet si j'essaye j'obtiens ce message :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    donnees <- read.csv2("DataOPCDA.csv",header=FALSE,sep=";")
    Erreur dans scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  : 
      could not allocate memory (1024 Mb) in C function 'R_AllocStringBuffer'
    De plus : Messages d'avis :
    1: In scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  :
      Reached total allocation of 1500Mb: see help(memory.size)
    2: In scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  :
      Reached total allocation of 1500Mb: see help(memory.size)


    Après quelques recherches sur les problèmes de chargement de grosses base de données, j'ai essayé d'augmenter la capacité d'allocation en jouant sur la fonction memory.size() mais sans succès.

    Je suis ensuite tombé sur la librairie bigmemory. L'utilisation de la fonction read.big.matrix() me permet de charger ma base de données. Le seul problème c'est qu'une de mes colonnes contient un timestamp. Pour vous donner une idée voici les 15 premières lignes de mon fichier :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    1	5.0	34.4	192	25/02/2010 10:53
    2	11.0	15.03	192	25/02/2010 10:53
    3	21.0	56.3	192	25/02/2010 10:53
    4	31.0	63.2	192	25/02/2010 10:53
    6	1.0	33.5	192	25/02/2010 11:03
    7	6.0	15.0	192	25/02/2010 11:02
    8	21.0	58.5	192	25/02/2010 11:03
    9	31.0	67.7	192	25/02/2010 11:03
    11	1.0	0.0	0	25/02/2010 14:28
    12	2.0	0.0	0	25/02/2010 14:28
    13	3.0	0.0	0	25/02/2010 14:28
    14	4.0	0.0	0	25/02/2010 14:28
    15	5.0	0.0	0	25/02/2010 14:28


    La fonction n'arrive donc pas à récuperer ma dernière colonne elle s'arrête au premier / (normal vu qu'elle attend un double par défaut)
    Si je lui demande d'afficher mes 15 premières lignes j'obtiens bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    donnees[1:25,1:5]
          [,1] [,2]  [,3] [,4] [,5]
     [1,]    5    1 34.40  192   25
     [2,]    2   11 15.03  192   25
     [3,]    3   21 56.30  192   25
     [4,]    4   31 63.20  192   25
     [5,]    6    1 33.50  192   25
     [6,]    7   11 15.00  192   25
     [7,]    6   21 58.50  192   25
     [8,]    9   31 67.70  192   25
     [9,]   11    1  0.00    0   25
    [10,]   12    2  0.00    0   25
    [11,]   13    3  0.00    0   25
    [12,]   14    4  0.00    0   25
    [13,]   15    5  0.00    0   25
    [14,]   16    6  0.00    0   25
    [15,]   17    7  0.00    0   25


    Ma question est donc la suivante : est-il possible de charger une matrice contenant une chaîne de caractère avec cette fonction read.big.matrix(). Si non, avez vous un moyen efficace de charger une grosse base de données contenant des timestamp ?



    Merci d'avance.

  2. #2
    Membre Expert
    Avatar de pitipoisson
    Homme Profil pro
    Chercheur
    Inscrit en
    Septembre 2006
    Messages
    1 942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 942
    Par défaut
    Bonjour et bienvenue,

    Malheureusement ça ne semble pas possible directement : il s'agit d'une matrice et donc tous les éléments doivent être du même type.
    De plus, l'option type="char" semble ne pas donner le résultat escompté... de toute façon ça aurait été une source d'ennuis d'avoir toute la matrice en characters.

    Je pense que quelles que soient les analyses que tu souhaites faire, tu auras besoin de charger ces timestamps dans un vecteur à part.
    Différentes techniques peuvent être utilisées pour les gros jeux de données (cf. http://cran.r-project.org/doc/manuals/R-data.html) :
    • utiliser directement la fonction scan, qui est moins gourmande en mémoire et temps processeur que read.table :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      > scan("data.tmp", what=list(NULL, "numeric", "numeric", "numeric", "character"), sep=",")
      Read 13 records
      [[1]]
      NULL
       
      [[2]]
       [1] "5.0"  "11.0" "21.0" "31.0" "1.0"  "6.0"  "21.0" "31.0" "1.0"  "2.0" 
      [11] "3.0"  "4.0"  "5.0" 
       
      [[3]]
       [1] "34.4"  "15.03" "56.3"  "63.2"  "33.5"  "15.0"  "58.5"  "67.7"  "0.0"  
      [10] "0.0"   "0.0"   "0.0"   "0.0"  
       
      [[4]]
       [1] "192" "192" "192" "192" "192" "192" "192" "192" "0"   "0"   "0"   "0"  
      [13] "0"  
       
      [[5]]
       [1] "25/02/2010 10:53" "25/02/2010 10:53" "25/02/2010 10:53" "25/02/2010 10:53"
       [5] "25/02/2010 11:03" "25/02/2010 11:02" "25/02/2010 11:03" "25/02/2010 11:03"
       [9] "25/02/2010 14:28" "25/02/2010 14:28" "25/02/2010 14:28" "25/02/2010 14:28"
      [13] "25/02/2010 14:28"
      Pour optimiser l'utilisation de mémoire, tu as en fait intérêt à ne lire que la dernière colonne :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      > scan("data.tmp", what=list(NULL, NULL, NULL, NULL, "character"), sep=",")[[5]]
      Read 13 records
       [1] "25/02/2010 10:53" "25/02/2010 10:53" "25/02/2010 10:53" "25/02/2010 10:53"
       [5] "25/02/2010 11:03" "25/02/2010 11:02" "25/02/2010 11:03" "25/02/2010 11:03"
       [9] "25/02/2010 14:28" "25/02/2010 14:28" "25/02/2010 14:28" "25/02/2010 14:28"
      [13] "25/02/2010 14:28"
      que tu peux stocker et transformer en objet de type date si besoin.

    • utiliser une base de données (éventuellement relationnelle) pour faire les extractions grâce à des requêtes SQL

    • ... (j'en oublie certainement)

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 9
    Par défaut
    Merci beaucoup d'avoir répondu aussi vite. Je vais essayé d'utiliser le scan().

    Si je n'y arrive pas avec j'envisagerai l'utilisation de base de données.

    En tout cas encore une fois merci pour le coup de main.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 9
    Par défaut
    Malheureusement le scan() est lui aussi trop gourmand. J'obtiens la même erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    > temps = scan("DataOPCDA.csv", what=list(NULL, NULL, NULL, NULL, "character"), sep=";")
    Erreur dans scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  : 
      could not allocate memory (512 Mb) in C function 'R_AllocStringBuffer'

    Je suppose qu'il n'y a pas 50 solutions. Soit je découpe mon fichier d'origine, soit je travaille avec des bases de données.

    A moins que quelqu'un est une autre idée ?

  5. #5
    Membre Expert
    Avatar de pitipoisson
    Homme Profil pro
    Chercheur
    Inscrit en
    Septembre 2006
    Messages
    1 942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 942
    Par défaut
    Il semble que le problème soit la taille du fichier d'entrée.
    Pour le contourner, tu peux essayer de stocker la dernière colonne dans un nouveau fichier à l'aide de la commande awk (commande unix que tu peux également avoir sous windows grâce à mingw ou cygwin) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F ";" '{print $NF}' ./data.tmp > ./timestamps.dat
    (si c'est bien séparateur ";")

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 9
    Par défaut
    Merci pour cette proposition.

    J'ai trouvé une méthode pas super mais qui permet de contourner le problème. J'utilise la fonction read.big.matrix() et je lui met comme séparateur : sep=";|/| |:".

    Du coup il me sépare ma dernière variable timestamp mais me charge bien tout dans une matrice. Je peux ensuite recréer une nouvelle matrice où je concatène mes dernières colonnes pour récupérer ma variable timestamp.

    C'est loin d'être idéal mais c'est une solution. J'essayerais quand même ta proposition quand j'aurais un peu de temps pour me pencher dessus. Merci encore pour cette aide.

Discussions similaires

  1. Réponses: 3
    Dernier message: 23/06/2011, 17h29
  2. Too Big Matrix
    Par biophysicist dans le forum MATLAB
    Réponses: 7
    Dernier message: 05/04/2011, 14h40
  3. Pb d'utilisation d'une librairie matrix.h
    Par Yeti_in dans le forum Débuter
    Réponses: 2
    Dernier message: 14/11/2008, 05h42
  4. copie de fichier en utilisant open,read,write
    Par une_tite_question dans le forum POSIX
    Réponses: 3
    Dernier message: 08/09/2008, 14h55
  5. Réponses: 2
    Dernier message: 21/03/2007, 15h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo