Mémoire insuffisante

Résolu
cs_tulesais Messages postés 175 Date d'inscription mercredi 2 juin 2004 Statut Membre Dernière intervention 11 avril 2013 - 3 juil. 2007 à 10:43
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 - 3 juil. 2007 à 16:10
Bonjour,

j'ai eu l'erreur N°7 : Mémoire insuffisante lors d'une mise en table d'un fichier de 58 Mo (104955 Lignes de longueur fixe '564 caractères') à la ligne 72741.
(72741 * 564 = 41 025 924 Caractères max)

' déclaration du tableau
public tableau() as string

Sauriez vous comment contourner cette limitation ?

Merci d'avance pour votre aide très précieuse...

17 réponses

cs_tulesais Messages postés 175 Date d'inscription mercredi 2 juin 2004 Statut Membre Dernière intervention 11 avril 2013 2
3 juil. 2007 à 15:36
C'EST BON !!!

en fait, mon problème ne venait pas de la limitation du tableau mémoire mais :

au moment ou je fais le redim preserve :

open fichier for input lock read write as #1
redim tableau(0)
indice=0
do while not eof(1)
   indice=indice+1
   redim preserve tableau(indice)
   line input #1, tableau(indice)
loop
close #1

solution :

' détermination du nombre de ligne
    lignemax = 0
    Open fichier For Input Lock Read Write As #1
    Do While Not EOF(1)
        Line Input #1, ligne
        lignemax = lignemax + 1
    Loop
    Close #1

' dimensionnement du tableau
redim tableau(lignemax)

' mise en table mémoire
open fichier for input lock read write as #1
indice=0
do while not eof(1)
   indice=indice+1
   line input #1, tableau(indice)
loop
close #1

Merci encore pour votre aide !!!

ps : le redim preserve est donc à banir !
1
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
3 juil. 2007 à 10:50
fichtre, tu rigole pas avec tes tableaux...

optimise sec, mais ton traitementpromet d'etre sympa, en VB...

fais ca en C...

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
3 juil. 2007 à 11:13
Oula ! Tu as vraiment besoin de lire toutes les données de ton fichier ? Tu ne pourrais pas en lire uniquement ce qui t'intéresse ?
0
cs_tulesais Messages postés 175 Date d'inscription mercredi 2 juin 2004 Statut Membre Dernière intervention 11 avril 2013 2
3 juil. 2007 à 11:17
Ayant besoin de revenir sur certains enregistrements, j'ai effectivement et malheureusement besoin de mettre en table la totalité du fichier.

Merci pour votre aide !!!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
3 juil. 2007 à 11:21
pas tout d'un coup ^^

tu peux lire on fichier par paquets, surtout que c'est LARGEMENT simplifié : tu connais la taille des lignes....

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
3 juil. 2007 à 11:38
Mais tu veux dire quoi par "mettre en table" ???

Tu veux mettre dans une table de base de données les données lues de ton fichier, c'est bien cà ?

A ce moment là, utilise un algorithme paresseux : lit uniquement les données qu'il te faut lorsque c'est nécessaire :
Il te faut la 15ème ligne, alors lit la quinzième ligne et mets la dans ta base.
Il te faut la 16ème, alors lit la seizième et mets la dans ta base
Il te faut la 15ème de nouveau, pas la peine de la relire, tu l'a déjà lu ! Donc lit uniquement les données de ta base
Et surtout : pas besoin de lire les autres, tu n'en a pas encore besoin !
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
3 juil. 2007 à 11:49
Ne jamais utiliser une pelle mécanique pour planter un pétunia ...
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
3 juil. 2007 à 12:29
Moi les pétunias, je les plante pas, je les sème

PS : Me cherchez pas, je suis déjà dehors

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
0
cs_tulesais Messages postés 175 Date d'inscription mercredi 2 juin 2004 Statut Membre Dernière intervention 11 avril 2013 2
3 juil. 2007 à 13:11
j'ai malheureusement, besoin de mémoriser l'ensemble du fichier pour, retravailler les données (parfois plusieurs enregistrements précédents) et sauvegarder l'ensemble dans un nouveau fichier.

y a t'il une limitation dans vb ou bien cette limitation est dûe à mon poste de travail ?

Merci beaucoup !!!
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
3 juil. 2007 à 13:35
Comme je te l'ai dit : pour faire ton traîtement, tu n'a certainement pas besoin d'absolument toutes les données (50 Mo, ca en fait du texte !!!), ne lit que ce dont tu as besoin selon un algo parasseux, et tu n'aura plus vraiment de limite du coup (d'ailleurs, un bon conseil, accès à ton fichier en mode binary si possible !!!).
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
3 juil. 2007 à 13:36
là ou je ne comprend pas c'est l'utilité de charger le fichier en mémoire.

Tu semble avoir des enregistrements de taille fixe, donc pour un enregistrement donné, tu sais exactement ou le trouver dans le fichier, alors pourquoi ne pas travailler directement sur le fichier dans ce cas là en mode accès aléatoire avec les instructions Put et Get si ma mémoire est bonne. Ca t'évitera d'avoir à charger la totalité du fichier en mémoire.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
3 juil. 2007 à 15:02
Hé...
Je le croyais parti (chez le grainetier...).
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
3 juil. 2007 à 15:53
vu que tu connais la taille de tes records, pas besoin de boucler sur ces gros fichiers...

divise la taille du fichier par celle des records.
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
3 juil. 2007 à 15:55
Line Input également à éviter dans ton cas, puisque tu connais la taille de tes records. (line input scanne caractère par caractère, a la recherche du CrLf...)
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
3 juil. 2007 à 16:00
Aïe Aîe Aîe ! Lecture de 50 Mo avec des line input !!! Mais dis moi, tu mets combien de temps à lire tout ton fichier ? Surtout que tu le lit 2 fois !!!

Tu dois y passer la nuit !
0
cs_tulesais Messages postés 175 Date d'inscription mercredi 2 juin 2004 Statut Membre Dernière intervention 11 avril 2013 2
3 juil. 2007 à 16:04
Quelle optimisation pourriez vous me conseiller ?

Merci beaucoup !!!
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
3 juil. 2007 à 16:10
Ben ce qu'on te dit depuis le début :  accès binaire (qui est bien plus rapide que les Line Input !!!) + algorithme paresseux plutôt que de lire tout le fichier !

A quoi ca te sert de tout stocker dans la mémoire ? Ne me dit pas que tu as besoin de TOUTES les données pour calculer 1 truc, ne stocke en mémoire que ce dont tu as besoin, et mets en base de données ce qui est lu afin que les prochaines lectures soient bien plus rapides.
0
Rejoignez-nous