cs_tulesais
Messages postés175Date d'inscriptionmercredi 2 juin 2004StatutMembreDernière intervention11 avril 2013
-
3 juil. 2007 à 10:43
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDerniè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 ?
cs_tulesais
Messages postés175Date d'inscriptionmercredi 2 juin 2004StatutMembreDernière intervention11 avril 20132 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
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013131 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 !
cs_tulesais
Messages postés175Date d'inscriptionmercredi 2 juin 2004StatutMembreDernière intervention11 avril 20132 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 ?
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013131 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 !!!).
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 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.
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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...)
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013131 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 !!!
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013131 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.