violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 2010
-
15 oct. 2006 à 16:22
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 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)...) ??
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 20102 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.
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 20102 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.
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 20102 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 ;)
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 20102 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 ?
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 20102 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 ?
kabak
Messages postés11Date d'inscriptionsamedi 4 novembre 2000StatutMembreDerniè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.
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 20102 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 ? ;-)