2010-10-15 6 views
1

Avant que quelqu'un ne le dise, je sais que ce n'est pas comme cela que cela doit être fait, mais c'est ainsi que cela a été fait et j'essaye de le supporter sans tout réécrire.
Je peux vous assurer que ce n'est pas le pire de loin.Erreur de mémoire insuffisante dans l'application VB6

Le problème se produit lorsque l'application lit un fichier entier dans une variable de chaîne. Normalement, cela fonctionne bien parce que les fichiers sont petits, mais un utilisateur a créé un fichier de 107 Mo et cela tombe.

intFreeFile = FreeFile 
Open strFilename For Binary Access Read As intFreeFile 
ReadFile = String(LOF(intFreeFile), " ") 
Get intFreeFile, , ReadFile 
Close intFreeFile 

Maintenant, il ne tombe pas à la ligne

ReadFile = String(LOF(intFreeFile), " ") 

mais sur le

Get intFreeFile, , ReadFile 

Alors qu'est-ce qui se passe ici, sûrement le chaîne a fait la mémoire allocation alors pourquoi se plaindre de manquer de mémoire sur le Get?

Répondre

0

Vous n'avez pas besoin de cet appel "GET", il suffit de le supprimer, vous mettez déjà le fichier dans une chaîne, il n'est donc pas nécessaire d'utiliser l'appel GET.

ReadFile = Input(LOF(intFreeFile), intFreeFile) 
+1

La ligne ReadFile = String (LOF (intFreeFile), " «) alloue seulement une chaîne de longueur LOF (intFreeFile) et le remplit avec des espaces. Nous avons toujours besoin du GET pour lire le contenu du fichier dans la chaîne. – kenneedham

+0

mal lu il a édité ma réponse – kyndigs

0

Généralement, la lecture d'un fichier implique une mise en mémoire tampon qui prend de la place. Je devine ici, mais je regarderais l'espace nécessaire pour la conversion d'octet en caractère. Les chaînes VB6 ont 16 bits, mais les fichiers (binaires) ont 8 bits. Vous aurez besoin de 107 Mo pour le contenu du fichier, plus 214 Mo pour les résultats convertis. L'allocation de chaîne ne réserve que les 214 Mo.

+0

Le fichier est un morceau massif de XML. La plupart de l'espace étant des images XMLisées. Je vais enquêter sur ce que vous dites bien. – kenneedham

+1

@kenneedham: ressemble à un cas où il est raisonnable de dire "Désolé, nous ne supportons pas cela". Ou ajoutez un cas spécial qui charge un octet à la fois si la taille du fichier est trop grande. (Les E/S disque réelles seront toujours mises en mémoire tampon par le système d'exploitation, vous n'obtiendrez pas 100 millions d'E/S physiques) – MSalters

+0

En effet. Bien que juste, ce n'est pas vraiment la faute des utilisateurs. Si l'application leur permet de le faire, cela devrait fonctionner. Dans ce cas, cela leur permet de télécharger les données mais de ne pas les télécharger à nouveau après avoir modifié les données spatiales. Le tout a besoin d'être réécrit mais je suis sûr que nous connaissons tous la réponse que je trouverais si je le suggérais. – kenneedham

-1

J'ai eu la même erreur. Et nous venons de vérifier le gestionnaire de tâches montrant 100% d'utilisation des ressources. nous avons découvert que l'une des applications de mise à jour prenait trop de mémoire RAM et nous venons de le tuer. cela a résolu le problème pour moi. Une dernière chose était que nous allions dans les paramètres de configuration. START-> RUN-> MSCONFIG et allez à l'onglet démarrage et décochez l'application qui ressemble à une application de mise à jour ou une application étrange que vous n'utilisez pas.

+0

Il se peut que l'application de mise à jour ait fonctionné dans votre cas, mais qu'elle ne s'applique pas à la question posée par le PO. – prabindh

+0

Je dis seulement cela pourrait être l'une des solutions, s'il vous plaît considérez cela comme ma correction à ma réponse. – CuriousRK

Questions connexes