Une matrice de taille énorme

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

Benoît Lamy
Messages : 75
Enregistré le : 09 Juil 2008, 07:57

Une matrice de taille énorme

Messagepar Benoît Lamy » 11 Juil 2008, 13:51

Bonjour à tous!

Je n'ai pas vu de partie "présentation", je me présente donc en quelques lignes: je viens de terminer mon master d'actuariat première année à Paris, j'ai postulé en deuxième année, je suis actuellement en stage à Lyon dans une compagnie d'assurances pendant quelques mois, et je dois faire des statistiques sur les sinistres avec le logiciel R. Je connais la base de R (faire des fonctions simples et des manipulations pas trop compliquées), j'avais quand même travaillé sur ce langage pendant deux ans dans ma faculté, mais là j'ai dû me lancer dans l'exploration des tests disponibles en statistiques (anova, bartlett, etc).

Ma question, la voici: je dois travailler sur une matrice importée d'Access (appelée matrice2) d'un million et demi de lignes, et de 65 colonnes. Un gros truc, donc. Sa taille est de 632677160. Le problème, c'est que je n'arrive pas à agir dessus, à changer des valeurs de cellule, supprimer une colonne, ou en ajouter une. Ainsi, quand je tape:

Code : Tout sélectionner

matrice2[1,1]=1

j'ai le message suivant:

Erreur : impossible d'allouer un vecteur de taille 5.7 Mo
De plus : Warning messages:
1: In x[[jj]][iseq] <- vjj :
Reached total allocation of 1535Mb: see help(memory.size)
2: In x[[jj]][iseq] <- vjj :
Reached total allocation of 1535Mb: see help(memory.size)
3: In x[[jj]][iseq] <- vjj :
Reached total allocation of 1535Mb: see help(memory.size)
4: In x[[jj]][iseq] <- vjj :
Reached total allocation of 1535Mb: see help(memory.size)


(avec des variantes, parfois il y a juste la première ligne, ou le 5.7 est remplacé par 11.5).

J'ai tenté de régler cela tout seul, d'abord en changeant les memory.limit et memory.size, en les passant à 4000, mais il suffit que je ferme ma session pour que le memory.limit revienne à sa valeur fétiche de 1535.875 (ce qui explique la valeur de 1535 dans le message d'erreur).
J'ai tenté également de changer le mem.limits en mettant de grandes valeurs mais là encore sans plus d'effet. J'ai tenté de séparer les colonnes puis de concaténer celles qui étaient intéressantes, je suis même allé fourrager du côté du cmd (je travaille sous Windows, j'avais vu une page internet recommandant de modifier une ligne en passant par le cmd, mais je crois que cela concernait Linux, et de toute manière cela a raté) mais là encore sans succès. J'ai lancé une nouvelle importation de la matrice d'Access mais en gardant moins de colonnes (taille sous R, 450 millions), cl'importation a fonctionné seulement au troisième essai (avant, deux messages d'erreur) et de toute manière la matrice là aussi n'est pas modifiable.

Les questions que je me pose:
pourquoi se focaliser sur les valeurs de 5.7 et 11.5? Mon ordinateur n'est pas une antiquité, il peut très bien enregistrer quelque chose de cette taille, et de toute manière quand je fais "matrice2[1,1]=1", le 1 de droite a une taille de quelques octets, pas davantage.
Le problème de taille est-il lié à la taille de l'objet, ou la taille de tous les objets enregistrés? Autrement dit, quand on a 50 objets de taille Z, si je veux travailler sur l'un d'entre eux, cela fonctionnera t-il mieux, moins bien ou pareil que si j'avais 10 objets de taille 5Z?
Et surtout, comment faire pour pouvoir modifier cette matrice comme je veux?

Après moult recherches et tentatives pendant deux jours d'affilée, j'avais temporairement laissé tomber, mais si vous aviez une idée cela m'arrangerait bien.
Merci d'avance.

Benoît Lamy
Messages : 75
Enregistré le : 09 Juil 2008, 07:57

Messagepar Benoît Lamy » 11 Juil 2008, 13:57

Bon, j'avais cherché sur internet, et pas sur votre forum, or certains messages traitent semble t-il déjà de la question.

Toutes mes excuses pour n'avoir pas fait ces recherches plus tôt.

Je me permettrai de réactiver ce post si cela ne fonctionne pas.

Encore toutes mes excuses.

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

Messagepar Stéphane Laurent » 12 Juil 2008, 16:01

Bonjour,

Peut-être peux-tu donner les liens vers les topics qui traitent tes différentes questions ? Ca pourrait faciliter les futures recherches.

Benoît Lamy
Messages : 75
Enregistré le : 09 Juil 2008, 07:57

Messagepar Benoît Lamy » 15 Juil 2008, 10:17

viewtopic.php?t=223
viewtopic.php?t=346
viewtopic.php?t=495
viewtopic.php?t=1236

J'ai lu les topics avec attention, j'ai tenté de rajouter la ligne magique flag pour le max meme size sur le raccourci R du bureau, sans véritable succès.
J'ai téléchargé ensuite le package bigmemory, puis j'ai tapé la ligne suivante:

Code : Tout sélectionner

matrice22=as.big.matrix(matrice2)

et la réponse fut cinglante: message d'erreur (impossible d'allouer un vecteur de taille machin chose, limite de 1535 dépassée), puis fermeture de R.

Cédric Carpentier
Messages : 13
Enregistré le : 03 Juil 2008, 09:40

Messagepar Cédric Carpentier » 15 Juil 2008, 15:10

Bonjour, je te conseil d'utiliser memory.size

Perso j'utilise souvent l'instruction suivante

memory.size(4000).

Si tu as un bon pc ça devrait passer.

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

Messagepar Pierre Bady » 15 Juil 2008, 20:16

bonjour,

tu peux aussi :
- travailler sur des sous jeux de données (tirage aléatoire, stratifié,etc. .. en fonction de tes objectives et de la structure des données).
- jeter un coup d'oeil du coté d'autres langages (ex. Python et C).

le python est relativement proche du langage 'S' et s'hybride bien avec R (cf par exemple le module rpy http://rpy.sourceforge.net/ ).

en espérant avoir aidé un peu

@+++

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

Benoît Lamy
Messages : 75
Enregistré le : 09 Juil 2008, 07:57

Messagepar Benoît Lamy » 16 Juil 2008, 09:59

Merci pour vos conseils, mais le memory.size, j'ai déjà essayé, sans changement notable. C'est l'ordi qui doit être insuffisant.
J'avais bien pensé à travailler sur un sous-jeu, mais je perds en précision, enfin, pourquoi pas, merci de m'avoir redonné l'idée.
Quant à S et Python, je ne connais pas (certes, cela fait une occasion d'apprendre).

Benoît Lamy
Messages : 75
Enregistré le : 09 Juil 2008, 07:57

Messagepar Benoît Lamy » 16 Juil 2008, 13:28

Bon, je crois que je vais demander à bénéficier d'un meilleur ordi.

Quelle est la chose à augmenter?
La RAM, la mémoire....? (en R mes connaissances sont assez limitées, alors dans la structure de l'ordinateur et ses caractéristiques, c'est proche de zéro)

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Messagepar Logez Maxime » 16 Juil 2008, 13:34

La taille de la mémoire que tu peux allouer a R dépend aussi de l'OS sous lequel tu travailles. Il me semble que si tu es sous Windows 32 bits de toute façon tu ne pourras pas alloué plus de 2Go de Ram a R. Il me semble aussi que sous Linux tu n'as pas ce genre de problème. Que quelqu'un m'arrête si je dis des bêtises.

Maxime

Benoît Lamy
Messages : 75
Enregistré le : 09 Juil 2008, 07:57

Messagepar Benoît Lamy » 16 Juil 2008, 13:59

Ah, mais oui, c'est vrai, j'avais oublié. Mon ordi a 1.95 Mo de RAM, donc le bénéfice est mince.

Là, j'ai encore essayé de faire des tests, mais il n'y a rien à faire! Les régressions linéaires généralisées plantent lamentablement. Les opérations, même simples, sont des échecs.

Que faire? Je suis censé produire des résultats, et je n'y arrive pas! Cela sert à quoi d'avoir avalé plusieurs polys indigestes sur la régression linéaire si je ne peux même pas en faire une?

Je suis déprimé profondément :cry:

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

Messagepar Pierre Bady » 16 Juil 2008, 14:38

bonjour,

as-tu testé la fonction 'bigglm' du package biglm ?
c'est peut-être une bonne piste (?)

@+



pierre
=@===--------¬-------¬------¬-----¬

liens utiles :

http://www.gnurou.org/Writing/SmartQuestionsFr

http://neogrifter.free.fr/welcomeOnInternet.jpg

]<((((*< -------------------------------

romain legrand
Messages : 13
Enregistré le : 25 Avr 2008, 09:19

Messagepar romain legrand » 16 Juil 2008, 14:45

Au pire tu peux travailler sur des échantillons et faire une validation croisé !

Benoît Lamy
Messages : 75
Enregistré le : 09 Juil 2008, 07:57

Messagepar Benoît Lamy » 16 Juil 2008, 15:21

Effectivement, j'ai commencé à travailler sur des échantillons, j'ai créé un programme permettant de sélectionner aléatoirement un certain nombre fixé de lignes de ma matrice (en passant, cela m'étonnerait beaucoup qu'il n'y ait pas une fonction préprogrammée en R qui fasse cela, j'ai googlisé le thème, mais sans succès, donc j'ai décidé de créer mon programme), mais celui ci est extrêmement lent, et surtout me flanque une liste impressionnante de warnings. Tant pis. Je le laisse mouliner, puis je regarde demain le résultat.

A Pierre: j'ai téléchargé le package, je l'ai testé comme çà, rapidement, j'ai eu droit à une erreur, je n'ai temporairement pas poussé plus loin. Dès demain, je me lance dans la lecture de la notice et j'essaye sérieusement.

Bref, ce sont les deux voies que j'essaye. J'espère que cela va fonctionner, sinon, je suis vraiment dans le pétrin.

Merci en tout cas de vous pencher sur mes problèmes et de m'aider.

Benoît Lamy
Messages : 75
Enregistré le : 09 Juil 2008, 07:57

Messagepar Benoît Lamy » 16 Juil 2008, 15:34

Ah si, autre chose: le flag max mem size dans le raccourci du Bureau, c'est exactement la même chose que changer memory.size() (les deux valeurs diffèrent du facteur 1048576, ce qui est dû à leurs unités respectives). Inutile donc de tenter de faire les deux (je parle plus pour le quidam de passage tombant sur ce sujet, que les spécialistes de ce forum qui doivent sans doute déjà le savoir).


Exceptionnellement, je me cite moi-même pour nuancer ce que j'ai écrit: en fait, il y a une différence entre les deux. Quand j'ai voulu lancer R comme à mon habitude, cela plantait, erreur fatal, impossible de charger RData, plafond de 1535 dépassé. Et j'ai compris ce qui s'était passé: quand j'utilise R, j'ai l'habitude de taper systématiquement memory.limit(4000), ensuite je travaille, j'enregistre mes données, mais le plafond revient automatiquement à 1535 quand je ferme R. Et donc si j'ai dépassé le plafond de 1535, le matin, R ne fonctionne plus. J'ai donc ajouté le flag max mem size dans les propriétés du raccourci (en fait je l'avais fait avant mais sur une autre version de R, enfin, pas sur une autre version, mais sur un autre R, pas Rgui, mais R autre chose) et j'ai pu ouvrir le R correctement avec mes données.

Voilà, je voulais citer, j'ai fait éditer, bon le message initial est entre citation donc il n'y a pas de perte.

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

Messagepar Nicolas Péru » 16 Juil 2008, 15:34

Ah, mais oui, c'est vrai, j'avais oublié. Mon ordi a 1.95 Mo de RAM, donc le bénéfice est mince.


C'est assez faible même sous XP. Attention car il ne faut pas confondre la RAM dont on dispose et la mémoire allouée aux programmes. Sur les 1.95 Go (j'espère que c'est Go !! :p) une bonne part est réservée au fonctionnement de base de windows, plus toutes les applis qui tournent en tache de fond et qui n'ont d'ailleurs souvent aucun intéret à être lancées constamment.
Donc une augmentation substantielle de la RAM ne serait certainement pas un luxe vu le jeu de donné. Ceci dit le package mentionné par Pierre est réellement un outil très performant au niveau programmation et permet de limiter grandement la gourmandise de R en terme de mémoire, personnellement je m'engagerais plutôt dans cette voie avant de tenter des sélections aléatoires de données (c'est la fonction sample() qui fait ça presque tout seul ;) ).
Le top pour analyser un tel jeu de donné serait certainement un server sous unix avec plusieurs processeurs et pas mal de RAM. Mais ça risque de coûter cher :D et il faudra encore savoir utiliser là fond les ressources de la bête.

En tout cas bon courage....

Nicolas


Retourner vers « Questions en cours »

Qui est en ligne

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