Type de donnée String

violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 - 15 oct. 2006 à 16:22
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 - 26 oct. 2010 à 18:08
Violent Ken

Salut, je pensais que l'on pouvait stocker 2^31 caractères dans une String.

Mais lors de l'opération :

Dim sTest As String
sTest = Space$(180000000)

j'obtiens l'erreur 14 ("Espace de chaîne insuffisant").
Alors comment puis-je stocker mes 2Go règlementaires dans ma String (sans passer par l'horrible type Variant, qui, lui, fonctionne pour Space$(180000000)...) ??

Merci, @+

13 réponses

Utilisateur anonyme
15 oct. 2006 à 16:40
Salut,

Divise la en plusieurs morceaux.
Mais que va tu faire avec une string aussi grande ?



Kenji
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
15 oct. 2006 à 16:47
Violent Ken

Salut, la diviser en plusieurs morceaux ne m'arrange pas vraiment...

Le but est de loader un fichier en mémoire, et de le faire tenir dans une string (avec l'API ReadFile).
Et comme j'utilise des Mid$ sur cette string pour en prendre des sections de longueur précise, je ne peux la découper.

Mon application est un éditeur hexadécimal. Je stocke les valeurs hexa dans un MSFlexGrid, et je ne les loade pas toutes en même temps (sinon le temps de chargement du fichier est énormément long ==> remplissage du Grid avec 200Mo = plusieurs minutes).
Donc je stocke le fichier dans une string par des APIs (quelques secondes tout au plus pour plusieurs centaines de Mo), et à chaque fois que je scrolle mon Grid, je réaffiche les valeurs hexa correspondant à la page du grid visualisée, et ces valeurs hexa sont une porition (obtenue avec Mid$) de la string contenant le fichier.

Comme le scroll du Grid doit être fluide, je ne relis pas à chaque fois la portion de fichier (trop long d'accéder au fichier), mais la portion de string.

Voilà, une autre idée ?

Merci, @+
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
15 oct. 2006 à 21:44
Bonsoir,
et tu chargeais ton fichier dans un TextBox ?

Encore une question :
Qu' est-ce qu' il a de si terrible ,  le Variant ?
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
15 oct. 2006 à 21:47
j' ai voulu dire :
si tu chargeais ton fichier dans un TextBox en arrière plan ?
0

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

Posez votre question
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
15 oct. 2006 à 22:10
Violent Ken

Salut, "mémoire insuffisante" pour la textbox.

(Je précise également que la variable string doit être public à un module).

Pour le type variant, disons qu'il est fort peu intéressant. Par exemple, deux procédures

Dim x as Variant, b As Variant
For x = 1 To 10000000
   'instruction
   b = b + 1
Next x

et

Dim x As Long, b as Long
For x = 1 To 10000000
   'instruction
   b = b + 1
Next x

ne sont pas équivalentes.
La seconde s'exécutera plus rapidement que la première, car le type Long nécessite moins de ressources que le type Variant.
Après compilation, la seconde boucle durera 15ms, la première durera 600ms.

Alors pour 2Go de données Variant....

@+
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
16 oct. 2006 à 00:54
salut,
çà ne va pas beaucoup aider mais.... avoir une String de 2Go veut dire avoir 2Go de mémoire paginée dispo (et consécutif selon cette utilisation)...

bon courage ^^
++
Prenez un instant pour répondre à ce sondage svp
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
16 oct. 2006 à 08:09
Salut, en effet ;) Mais j'ai 2Go de physique et 1.5*2Go = 3Go de swap, donc ma String de 2Go tiendrait assez facilement dans mes 5Go de virtuelle.... si çà ne bugait pas ;)

@+
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
16 oct. 2006 à 11:29
umm, et çà ne serait pas Space qui ne supporte pas?
tu as essayé du genre.... Test = String(90000000, " ") & String(90000000, " ") ?

Prenez un instant pour répondre à ce sondage svp
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
16 oct. 2006 à 13:23
Violent Ken
Salut, je n'ai pas essayé la concaténation de deux String(n , s) (j'essayerais ce soir, je suis sous Linux ce midi).

Mais l'instruction Space(n) fonctionne avec le type Variant, et pas avec le type String. Donc on peut penser que le problème ne vient pas de cette commande ?

Merci, @+
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
16 oct. 2006 à 13:32
çà ne correspond pas trop mais j'ai un peu de mal à trouver des solutions alternatives....
(pis je suis pressé là ^^)

Private Sub Form_Load()
    Dim sTest' As String
    sTest =  Space(180000000)
    MsgBox VarType(sTest) '<-- te renvoie tout de même 8
End Sub        

<small>Coloration
syntaxique automatique [AFCK] </small>
       

fonctionne en variant et en string, c'est "$" qui doit mal faire son job...

<hr size ="2" width="100%" />Prenez un instant pour répondre à ce sondage svp
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
16 oct. 2006 à 18:27
Violent Ken

Salut !

Alors pour la concaténation .... çà ne marche pas :(

Et en fait, le Space$ fonctionne aussi bien que le Space. Le problème survient uniquement si la String n'est pas déclarée dans la procédure. Autrement dit,

Public sTest  As String
Private Sub Form_Load()
    sTest = Space$(180000000)
    MsgBox VarType(sTest) '<-- te renvoie tout de même 8
End Sub

ne passe pas, mais


Private Sub Form_Load()
Dim sTest As String
    sTest = Space$(180000000)
    MsgBox VarType(sTest) '<-- te renvoie tout de même 8
End Sub

passe. Avec ou sans '$'. Mais par contre, Public sTest as Variant passera aussi....

Bizarre ? Devrais-je me résoudre à utiliser ce type ?

Merci, @+
0
kabak Messages postés 11 Date d'inscription samedi 4 novembre 2000 Statut Membre Dernière intervention 8 décembre 2010
26 oct. 2010 à 16:56
Peut-etre faudrait-il tout simplement changer de méthode ?

Si c'est un éditeur hexadécimal, tu dois pouvoir découper virtuellement le fichier en page de 512 octets par exemple. C'est plus simple à stocker en mémoire et pour faire glisser, il suffit d'avoir 2 "pages" en mémoire soit 1Kio (un peu plus pour faire défiler et avoir de la réserve).

Le probleme du défilement fluide après peut-etre résolu grace à une astuce au niveau de l'affichage à mon avis.

Quand tu fait un défilement lent, le disque et l'affichage ont le temps de suivre donc pas de soucis, la méthode de la lecture position du scroll => lecture du secteur du fichier => affichage marche sans probleme.
Par contre en défilement rapide, si ton ordinateur doit afficher toute les pages que tu survoles (parce que tu veux faire glisser l'ascenseur directement vers la fin du fichier), il devra donc tout lire et donc mettra un temps fou.

Le plus simple à mon avis est d'utiliser un évenement timer qui toute les 20ms (ca fait déja 50 affichages par seconde) va verifier si l'ascenseur à été déplacé et si oui, il va lire le secteur à afficher et l'afficher.

Comme ca en déplacement rapide, l'ordi n'aura plus à lire et a afficher un tout le fichier ce qui sera bien plus rapide et tu gardes ton impression de fluidité à basse vitesse.

Et en plus tu économises un paquet de mémoire.
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
26 oct. 2010 à 18:08
Salut,

Dans le cadre d'un éditeur hexadécimal, lire le fichier complet et le stocker en mémoire est une solution de facilité vaguement intéressante pour de petits fichiers... mais globalement c'est une solution immonde et elle ne doit JAMAIS être utilisée, sauf cas très particulier (exemples : lecture de fichiers *uniquement* de faible taille, fichiers non dispos en permanence sur disque, fichiers lus sur le réseau, ...etc.).

Evidemment, la solution correcte est de stocker en mémoire uniquement quelques chunks (de 512 bytes généralement). Concrètement 3 minimum (currentChunk, previousChunk et nextChunk), soient 512*3 = très peu de mémoire. Le currentChunk pour le chunk qui correspond à la position courante, et le previous/next pour la gestion du défilement. Eventuellement quelques chunks en plus pour bufferiser tout çà et permettre l'affichage simultané de plusieurs chunks (par exemple le cas d'un éditeur texte affichant plus de 1024 bytes à l'écran avec des chunks de 512 bytes).

Pour le timer de gestion du défilement c'est effectivement ce qui est généralement fait pour un éditeur hexa (ou tout du moins n'importe quel éditeur qui ne stocke pas le fichier en mémoire) afin d'éviter de faire des appels disque inutiles pendant le défilement du scollbar, avant que l'user ne stabilise sa vue.

Donc la question de ce topic est débile, on ne stocke jamais autant de données en mémoire -__-, on se débrouille pour les lire sur disque quand on en a réellement besoin...


La vraie et bonne question est : pourquoi répondre à un topic vieux de 4 ans ? ;-)
0
Rejoignez-nous