Charger un fichier de 30 Mo dans une String... "Out Of Memory"

jockos Messages postés 321 Date d'inscription dimanche 22 octobre 2000 Statut Membre Dernière intervention 14 mai 2005 - 20 sept. 2002 à 14:22
OneHacker Messages postés 1447 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 23 septembre 2007 - 29 mai 2005 à 10:18
La question se trouve dans le titre...

J'ouvre un très gros fichier (environ 30 Mo) et je l'affiche dans un RtfTextBox (avec la méthode LoadFile)...
Jusqu'ici tout va bien...

J'ai besoin de mettre ce fichier dans un String pour travailler dessus (faire des calcul pour Hasher le contenu de la String)...

Bref, quand je fais l'affectation:

maString=rtftxtText.Text

ça plante...
et ça m'écris: "Out Of Memory"...

Pourquoi est-ce que Windows n'utlise pas le Swap (partie du disque dur = mémoire virtuel) pour charger ma Variable String...

Merci pour votre aide...

Jock

12 réponses

cs_Benzoid Messages postés 9 Date d'inscription vendredi 13 septembre 2002 Statut Membre Dernière intervention 26 septembre 2002
20 sept. 2002 à 14:59
Salut

Tu vas avoir un problème

Le type string peut contenir seulement 64 Ko faut que tu découpes ton fichier

Bonne chance

Benzoid
jockos Messages postés 321 Date d'inscription dimanche 22 octobre 2000 Statut Membre Dernière intervention 14 mai 2005 2
20 sept. 2002 à 15:09
Tu es sûr de ce que tu dis...?
Parce que, je suis persuédé d'avoir remplit des variables String avec un contenu dépassant 64Ko, et de très loin...

Je doute vraiment de ce que tu viens de me dire, mais merci quand même pour ton aide...

Tu l'as eu où ce renseignement qui dit qu'un variable String peut contenir au Maximim 64Ko ?

Jock
cs_Benzoid Messages postés 9 Date d'inscription vendredi 13 septembre 2002 Statut Membre Dernière intervention 26 septembre 2002
20 sept. 2002 à 15:46
ca vient de l'aide de vb5, voila la copie :
Type élémentaire de données contenant des informations alphanumériques. Une variable de type String peut contenir environ 65 535 octets (64 Ko), peut être de longueur fixe ou variable et contient un caractère par octet. Les chaînes de longueur fixe ont une longueur déclarée qui est invariable. Les chaînes de longueur variable peuvent comporter 64 Ko, moins quelques octets destinés à leur stockage.
Le caractère type de déclaration du type de données String est $.

Bon courage

Benzoid
jockos Messages postés 321 Date d'inscription dimanche 22 octobre 2000 Statut Membre Dernière intervention 14 mai 2005 2
20 sept. 2002 à 16:31
J'ai VB6, et j'ai stocké des flux de plusieurs Mo dans une string... donc, la limite ne s'applique pas à 64Ko, je peux te l'assurer...

Je pense qu'une String est limité par la quantité limité et par la manière dont est géré la mémoire par l'OS... (pagging, Segmentation...).

Ce qui me fait chier, c'est qu'il utilise 0% de la mémoire virutelle... et pourtant là j'ai de la place (2048 Mo)...

Comment allouer une variable (de type String) dans la mémoire virtuel... en fait, ma question revient à cela...

C'est de la grosse merde le VB en terme de gestion de flux... ça vaut vraiment pas le C++ la dessus, mais bon, vous allez me dire que là n'est pas son rôle, mais bon, ça fait chier defois VB...

A+

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

Posez votre question
cs_rene38 Messages postés 1858 Date d'inscription samedi 29 juin 2002 Statut Membre Dernière intervention 17 octobre 2013 11
21 sept. 2002 à 00:03
Aide de VB6
String, type de données
Type de données composé d'une séquence de caractères contigus interprétés en tant que caractères et non en tant que valeurs numériques. Une donnée de type String peut inclure lettres, nombres, espaces et signes de ponctuation. Le type de données String peut stocker des chaînes de longueur fixe dont la longueur est comprise entre 0 et environ 63 Ko de caractères et des chaînes dynamiques dont la longueur est comprise entre 0 et environ 2 milliards de caractères. Dans Visual Basic, le signe dollar ($) est le caractère de déclaration du type String.
jockos Messages postés 321 Date d'inscription dimanche 22 octobre 2000 Statut Membre Dernière intervention 14 mai 2005 2
21 sept. 2002 à 12:10
Merci pour l'info...

Faisons des calculs pour voir la taille maximal d'un fichier que l'on peut afficher dans une String dynamique (c'est à dire déclaré sans limitation, par exemple:
str As String 'String dynamique
str2 As String * 200 'String statique (200 octets maximum)
)

1 octet = 1 caratère en VB (tout comme en C d'ailleur)

2 milliards de caractères = 2 milliards d'octets

2 milliards d'octets = 1907 Moctets

On peut donc stocker un fichier de 1907 Mo maximum dans une String dynamique...
C'est chelou, parce que moi, le maximum que j'arrive à stocker dans une string est de l'ordre de 12 Mo environ...

Je comprend pas... et ce con de Windows ne Swap pas en mémoire virtuel (j'ai regarder la mémoire pour voir ce qui se passais)...

Est-ce que quelqu'un peut essayer de charger un gros fichier dans une String et me dire ce que cela donne...

Merci beaucoup

Jock
VicoLaChips2 Messages postés 436 Date d'inscription dimanche 20 janvier 2002 Statut Membre Dernière intervention 2 février 2010 2
21 sept. 2002 à 18:28
Bonjour,

C'est quoi les données du problème ?? à part la partie 30 MO ???
A+
jockos Messages postés 321 Date d'inscription dimanche 22 octobre 2000 Statut Membre Dernière intervention 14 mai 2005 2
21 sept. 2002 à 18:45
salut,

Les données du problème sont les suivantes :

Je charge le contenu d'un fichier qui fais 30 Mo (ou plus) dans un RichTextBox, avec la méthode LoadFile.

Jusqu'ici pas de problème... par contre, quand j'affecte le contenu du richTextBox à une String dynamique (c'est à dire sans limitation), pendant l'éxectuion, ça plante avec comme message "Out Of Memory".

De là, j'en déduis qu'une String ne peut pas faire plus de 30 Méga caractères (car 1 caractère = 1 octet)...

Peut importe la mémoire vive, puisque normalement, si Windows ne trouve pas 30 Mo de libre dans la Ram, il va utiliser le fichier de mémoire virtuel contenu sur le disque dur...

Moi, ça me parait bizarre qu'une String soit limité à 30 Mo...

d'après rene38, une String peut contenir 2milliards de caractères, soit 1908 Mo de données au maximum...

Qu'en penses-tu?

Jockos
VicoLaChips2 Messages postés 436 Date d'inscription dimanche 20 janvier 2002 Statut Membre Dernière intervention 2 février 2010 2
21 sept. 2002 à 19:08
1 caractère = 4 octets...

Mais pourquoi le charger dans une variable de type STRING ???

Si tu essayes de faire :
Dim MyBigString 'sans préciser le type (donc variant)

LoadResult = MyBigString

Toujours le même problème ??

Good luck :) A+
jockos Messages postés 321 Date d'inscription dimanche 22 octobre 2000 Statut Membre Dernière intervention 14 mai 2005 2
21 sept. 2002 à 19:32
J'ai essayé en déclarant ma Variable ave le Type Variant... rien ne change...

Je comprends pas...
Je peux chargés dans le RichTextBox un fichier de 100 Mo!!! et je ne peut pas le mettre dans une variable VB (String ou Variant)... il me dit "Out Of Memory"... j'ai envie de lui répondre:
"Et le fichier Swap, c'est de la merde, il sert à quoi si il est là!!!!!!?????"...

Merci quand même...

Jockos
surfzoid Messages postés 463 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 21 avril 2010
30 déc. 2003 à 00:01
en fait g un peu le meme souci mais ds l otre sens string ver richtext = out of memory et donc au lieu d utilisé une var string ds mon projet j utilise directement lobjet richtext je sais c + long mé ca marche
:big)
OneHacker Messages postés 1447 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 23 septembre 2007 2
29 mai 2005 à 10:18
Je sais ce que c'est, j'ai le même problème ! En fait il s'agit de tes cartes RAM que tu as dans l'unité centrale. Moi personellement, je n'ai que 128 MO de RAM, mais il n'y a pas que ca: Tous les programmes qui travaillent en tâche de fond utilise aussi la mémoire RAM, je sais que si j'installe Norton Antivirus ca va me bouffer la méoire RAM.

Sur ma source MicroWriter si je charge en fichier ca va mais quand je ferme une fenêtre ca fait la même erreur que toi donc il faut trouver un moyen de libérer le fichier qui est toujours en mémoire même si tu ne l'utilises pas ! Et ca, je sais pas le faire !

Redman
Rejoignez-nous