Problème avec mémoire Vive

YahnIck Messages postés 13 Date d'inscription jeudi 13 juin 2002 Statut Membre Dernière intervention 19 septembre 2002 - 19 sept. 2002 à 13:46
YahnIck Messages postés 13 Date d'inscription jeudi 13 juin 2002 Statut Membre Dernière intervention 19 septembre 2002 - 19 sept. 2002 à 18:16
avec VB6 je fait une création de fichier textes d'une taille de 40 Mo environs.

avec une boucle For le prog crée un fichier texte à chaque tour de boucle.

mon problème c'est que au fur et à mesur que le programme crée les fichiers texte, la quantité de mémoire vive disponible diminue aussi. et au bout de 20 fichiers créés je suis à 100% d'utilisation de la mémoire vive. ( j'ai + de 700 Mo ram)
je comprend pas pourquoi alors que les fichiers sont créés sur le disque dur???

est ce quelqu'un pourrait m'expliquer pourquoi et comment résoudre le problème (récuperer la mémoire)

merci de votre attention

a+

yann

10 réponses

cs_imer Messages postés 59 Date d'inscription vendredi 26 juillet 2002 Statut Membre Dernière intervention 29 janvier 2004
19 sept. 2002 à 14:01
Peut être cela pourra t'aider:

Si, pour créer tes fichiers textes, tu ouvres le fichier (avec l'instructuion Open ou la méthode OpenTextFile de l'objet FileSystemObject, par exemple), alors pense à le refermer avant d'en ouvrir un autre.
0
YahnIck Messages postés 13 Date d'inscription jeudi 13 juin 2002 Statut Membre Dernière intervention 19 septembre 2002
19 sept. 2002 à 14:19
Je ferme le fichier open avec l'instruction Close #

est ce la bonne méthode ou y'en a t il une autre ?
0
cs_imer Messages postés 59 Date d'inscription vendredi 26 juillet 2002 Statut Membre Dernière intervention 29 janvier 2004
19 sept. 2002 à 14:49
'Le code suivant crée 35 fichiers textes de 40 Mo environ
'Pendant l'exécution, dans le gestionnaire des taches, l'UC est à 100% et la mémoire reste stable -> 112000K environ/256 Mo Ram)

Dim FileNumber As Long
Dim i_ligne As Long
Dim j_fichier As Long

For j_fichier = 1 To 30
FileNumber = FreeFile
Open "c:\test" & CStr(j_fichier) & ".txt" For Output As #FileNumber
For i_ligne = 0 To 3500000
Print #FileNumber, "azertyuiop"
Next i_ligne
Close #FileNumber
Next j_fichier
0
YahnIck Messages postés 13 Date d'inscription jeudi 13 juin 2002 Statut Membre Dernière intervention 19 septembre 2002
19 sept. 2002 à 15:25
Aie

je viens d'essayer le code
et
bien aux 17 eme fichier la mémoire est pleine

où ai je fais l'erreur?
j'ai fait un copier coller du code

cela viens de mon système d'exploitation ? j'ai windows 98
0

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

Posez votre question
cs_imer Messages postés 59 Date d'inscription vendredi 26 juillet 2002 Statut Membre Dernière intervention 29 janvier 2004
19 sept. 2002 à 16:01
Aïe en effet.
J'ai Windows 2000 et aucun problème.
Il ne doit pas gérer l'écriture sur disque de la même façon.
Essaie avec FileSystemObject (cf MSDN) sinon tente ce code pour voir. Il ferme et ouvre le fichier au bout d'un certain nombre de lignes écrites. A toi de faire varier "Nb_EcritureMax". C'est plus long à l'exécution

Dim FileNumber As Long
Dim i_ligne As Long
Dim j_fichier As Long
Dim Nb_Ecriture As Long
Dim Nb_EcritureMax As Long

Nb_EcritureMax = 1000

For j_fichier = 1 To 30

'Suppression du fichier s'il existe
If Dir("c:\test" & CStr(j_fichier) & ".txt") <> "" Then
Kill "c:\test" & CStr(j_fichier) & ".txt"
End If

Nb_Ecriture = 0
FileNumber = FreeFile

'écriture dans le fichier
Open "c:\test" & CStr(j_fichier) & ".txt" For Append As #FileNumber

For i_ligne = 0 To 3500000
Print #FileNumber, "azertyuiop"
Nb_Ecriture = Nb_Ecriture + 1

'libération de la mémoire en fermant et ré-ouvrant le fichier
If Nb_Ecriture > Nb_EcritureMax Then
Nb_Ecriture = 0
Close #FileNumber
FileNumber = FreeFile
Open "c:\test" & CStr(j_fichier) & ".txt" For Append As #FileNumber
End If

Next i_ligne

Close #FileNumber

'fichier suivant
Next j_fichier
0
jockos Messages postés 321 Date d'inscription dimanche 22 octobre 2000 Statut Membre Dernière intervention 14 mai 2005 2
19 sept. 2002 à 16:36
Quand on ouvre un fichier et que l'on travail dessus, de même pour les EXE, ou n'importe quel process, c'est dans la mèmoire vive que ça se passe. (heuresement d'ailleur, parce que quand on voit la différence entre les temps d'accès disque et ceux de la mèmoire vive, on comprend mieux pourquoi ça marche comme ça)...

Bref, tout ça pour dire, que quand on charge un fichier en mémoire vive (c'est exactement ce que fais la commande Open), on occupe une place mémoire statique, un peu comme un tableau...

Un fichier de 40 Mo ne tiendra pas forcément dans la mémoire vive, car il faut qu'il y ait 40 Mo de libre à la suite...
Mais ce que je ne comprend pas, c'est pourquoi est-ce que ce bon vieux Windows ne Swap pas sur le disque dur quand il n'a pas la place nécessaire en Ram... (c'est ce qui se passe quand on ouvre un très très gros fichier . doc avec Word par exemple... on entend le disque dur qui rame.... bzzzz et d'ailleur, le Pc rame aussi, parce que la Swap est très gourmand en ressource...).

Moi j'ai le même blème, quand j'ouvre un fichier texte de plus de 10 Mo pour le chargé dans un TextBox, ça plante... (bon, j'ai que 128 Mo de Ram, mais quand même!!! merde.... lol)

Donc la question, c'est pourquoi est-ce qu'il ne swap pas ce prog VB, est-ce qu'il faut lui dire, parce que ça a pas l'air de se faire par défaut et pourtant, je croyais que c'était Windaube qui gérait la mémoire vive...

En tout cas laisse tomber l'objet FileSystem, ça bopuffe encore plus de ressource, c'est un ActiveX, contrairement à Open, Close qui sont des méthodes de classes internes à VB.

Jockos
0
YahnIck Messages postés 13 Date d'inscription jeudi 13 juin 2002 Statut Membre Dernière intervention 19 septembre 2002
19 sept. 2002 à 16:47
En faite mon problème n'est pas la création des fichiers, car m^me arrivé à 100% de la mémoire il continue à les créer. il doit certainement utiliser le disque dur.

bon problème c'est que dès que les fichiers ont été créer, le prog enchaine sur une autre tache qui gère des images, or pour traiter des images il me faut de la memoire et lorsque la tache commence ben la memoire ne c'est pas vidé suite à la fin de la tache précédente (la création des fichiers) et là ça plante!!
0
YahnIck Messages postés 13 Date d'inscription jeudi 13 juin 2002 Statut Membre Dernière intervention 19 septembre 2002
19 sept. 2002 à 16:47
En faite mon problème n'est pas la création des fichiers, car m^me arrivé à 100% de la mémoire il continue à les créer. il doit certainement utiliser le disque dur.

bon problème c'est que dès que les fichiers ont été créer, le prog enchaine sur une autre tache qui gère des images, or pour traiter des images il me faut de la memoire et lorsque la tache commence ben la memoire ne c'est pas vidé suite à la fin de la tache précédente (la création des fichiers) et là ça plante!!
0
cs_imer Messages postés 59 Date d'inscription vendredi 26 juillet 2002 Statut Membre Dernière intervention 29 janvier 2004
19 sept. 2002 à 18:11
Faire un DoEvents ou utiliser l'API "sleep" pour laisser souffler le système ?....
0
YahnIck Messages postés 13 Date d'inscription jeudi 13 juin 2002 Statut Membre Dernière intervention 19 septembre 2002
19 sept. 2002 à 18:16
Non

il ne vide pas la mémoire

pour l'instant seul moyen trouver :
redemarrer

génant poure faire une succession de tache
0
Rejoignez-nous