Traitement de Mega Gros Fichier (1,6 Go)

VBSorcier Messages postés 102 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 29 avril 2007 - 11 sept. 2005 à 22:52
VBSorcier Messages postés 102 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 29 avril 2007 - 18 sept. 2005 à 21:40
Bon j'ai un gros fichier de 1,6Go, qui contient des coordonnées XYZ du relief de tout le globe !!!!

j'interprete ces données pour les dessiner dans une picturebox mais le pb c'est que c'est long

picturebox : height=9000, width=18000

pa gagner du tps je saute 20 lignes pour 1 ligne lue et interpreté, parce que ya telement de point que la qualité d'image n'est pa affecté,

si je zoom je doi me relire tt le fichier
et si je garde le meme type de fonction, la qualité va decroitre(moin de point lu) et tjour aussi long
et donc ma question est :

Comment lire le fichier très rapidement ???
un peu comme "UltraEdit" (je sais pa si vous connaisser, mais c'est l'editeur hexa de tt bon developpeur) et surtout très rapide

merci par avance
j'ai deja eccumé les posts du forum du site
les methodes Open, Readfile

a+

13 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 sept. 2005 à 22:58
UltraEdit est en VB ?

ciao...
BruNews, MVP VC++
0
VBSorcier Messages postés 102 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 29 avril 2007
11 sept. 2005 à 23:07
non je pense pas vu sa rapidité et sa complexité
ca doit du C++

mais sur la page principal de son site (www.ultraedit.com), il a reçu l'award du meilleur soft de l'année

il met environ 5 min pour me lire le fichier en entier sans ralentir le pc et sans engloutir la memoire !!!
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 sept. 2005 à 23:13
Ben voila tu donnes toi même la réponse à ta question, le C est obligatoire pour les traitements lourds.

ciao...
BruNews, MVP VC++
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
12 sept. 2005 à 10:25
Pas obligatoire tout de même BruNews, faut pas éxagérer ;)



Bon c'est sur que sur les opérations d'entrées/sorties, le VB est loin
d'être aussi rapide que le C, je te l'accorde, mais si tu nous disais
comment tu fait pour :

1/ Lire ton fichier

2/ Afficher tes points



On pourrait plus facilement te dire comment améliorer tes algorithmes (si on peut les améliorer).

_____________________________________________________________________
DarK Sidious

Un API Viewer (pour le VB, VB.NET, C, C# et Delphi) tout en français : www.ProgOtoP.com/popapi/
0

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

Posez votre question
VBSorcier Messages postés 102 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 29 avril 2007
12 sept. 2005 à 18:21
'Chaque ligne du fichier comporte 3 champs séparés par 1 virgule
'ex:
'46.25455,2.58547,35
'=> 46.25455 °N
' 2.58547 °E
' 35m d'altitude


'Map etant ma picturebox (height=900 width=18000)
'f etant mon coeff de zoom, par defaut =50 (au demarrage)
'ech (echelle) est une picturebox avec une echelle de couleur en fonction de l'altitude


Sub Draw_Relief_World()

'pour donner le pt de longitude et de lattitude 0
cx = Map.Width / 2 '(9000)
cy = Map.Height / 2 '(4500)

DoEvents

Open App.Path & "\World.xyz" For Input As 1

Do While Not EOF(1)
Line Input #1, reponse


temp = reponse
Lon = Replace(Mid(temp, 1, InStr(temp, ",") - 1), ".", ",")
temp = Mid(temp, InStr(temp, ",") + 1)
Lat = Replace(Mid(temp, 1, InStr(temp, ",") - 1), ".", ",")
Alt = Replace(Mid(temp, InStr(temp, ",") + 1), ".", ",")


X = cx + Lon * f
Y = cy - Lat * f

'==============================================
'Partie pour appliquer une couleur en fonction de l'altitude
'le pixel 383 est mon 0 sur l'echelle


Alt = Alt
If Alt < 0 Then
a = Abs(Alt) / 31
ColorRelief = ech.Point(383 - a, 1)
ElseIf Alt >= 0 Then
a = Alt / 26
ColorRelief = ech.Point(384 + a, 1)
End If
'==============================================


Map.PSet (X, Y), ColorRelief



'cette partie est juste là pour aller plus vite
'je saute quelque point en fonction du zoom


On Error Resume Next
If f = 200 Then
Line Input #1, reponse
Line Input #1, reponse
ElseIf f = 100 Then
Line Input #1, reponse
Line Input #1, reponse
Line Input #1, reponse
Line Input #1, reponse
Line Input #1, reponse
Line Input #1, reponse
ElseIf f = 50 Then
Line Input #1, reponse
Line Input #1, reponse
Line Input #1, reponse
Line Input #1, reponse
Line Input #1, reponse
Line Input #1, reponse
Line Input #1, reponse
Line Input #1, reponse
Line Input #1, reponse
Line Input #1, reponse
Line Input #1, reponse
Line Input #1, reponse
Line Input #1, reponse
Line Input #1, reponse
Line Input #1, reponse
Line Input #1, reponse
End If
DoEvents
Loop
Close #1



DoEvents


End Sub


voila, je pense que le code est deja pas mal optimisé

l'api Readfile c'est pas la peine sa bloque le PC le fichier est beaucoup trop gros

merci
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 sept. 2005 à 18:43
VBSorcier > ce fichier est-il téléchargeable qlque part ?

ciao...
BruNews, MVP VC++
0
VBSorcier Messages postés 102 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 29 avril 2007
12 sept. 2005 à 18:54
en fait pour l'avoir j'ai eu du mal, sur un site americain le :
National Geophysical Data Center - NGDC

(http://www.ngdc.noaa.gov/)

ce site regroupe tout un tas de donnée sur le globe: relief, cote de bord de mer, geologie...

a debut j'ai télécharger un zip (131 Mo) contenant un soft (GEODAS) et un fichier de 225Mo, le soft a decompresser et decrytper le fichier, pour donné un fichier (de 1.6Go) au format XYZ

http://www.ngdc.noaa.gov/mgg/gdas/gd_cri.Html
il faut aller sur ce lien pour entrer les parametres de la zone voulu et suivre le chemin, c'est tout simple

a+
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 sept. 2005 à 19:07
merci pour les liens je vais essayer de le récupérer.

Si je comprends bien, chaque ligne contient 2 double et 1 entier ?
Si oui, pourquoi ne pas transformer cela 1 bonne fois pour toute directement en binaire:
une structure (type en vb si je me souviens bien):
Double
Double
Long

ferait une stuct de 20 octets par enreg, ne plus mettre de sauts de ligne, c'est une cata en performance pour la lecture. Je pense qu'ainsi tu aurais des perfs nettement plus acceptables.

ciao...
BruNews, MVP VC++
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
12 sept. 2005 à 19:58
Ben déjà, lire le fichier en binaire s'impose comme le précise BruNews, au lieu de le lire en Input !!!



Ensuite, tu utilises la fonction Point pour afficher tes points, et tu
t'étonnes que ca rame ??? Va voir ma source de gestion d'image :
environ 35 fois plus rapide pour afficher des points !


Avec cà, tu devrais y gagner pas mal de temps je pense !

_____________________________________________________________________
DarK Sidious

Un API Viewer (pour le VB, VB.NET, C, C# et Delphi) tout en français :
0
VBSorcier Messages postés 102 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 29 avril 2007
12 sept. 2005 à 20:14
ok pour ecrir une structure dans un fichier mais comment faire pour que ca prenne 20 octet

Private Type XYZ
X as Double
Y as Double
Z as Long
End Type

sub Toto()

dim coordon as XYZ
open fileOut for random as 1
open fileIn for input as 2
do while not eof(2)
line input #1,reponse
'================
interpretation de la ligne
...
coordon.x=...
coordon.y=...
coordon.z=...
'================

put #1,,coordon
doevents
loop
close #2
close #1
end sub

sinon pour limité la taille, je sais que faire comme ca:

Private Type XYZ
X as String * 7
Y as string * 7
Z as string * 6
End Type

..........
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 sept. 2005 à 20:30
Le but est de transformer ton fichier pour ensuite t'en servir en format binaire.
DARKSIDIOUS va te guider, allez Dark...

ciao...
BruNews, MVP VC++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 sept. 2005 à 21:43
Je veux bien faire la transformation (par le C pour ma part) mais faudrait que je trouve le fichier et comme je n'installe rien sur mes machines, c'est pas gagné. Me faudrait un lien direct sur le zip ou autre.

ciao...
BruNews, MVP VC++
0
VBSorcier Messages postés 102 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 29 avril 2007
18 sept. 2005 à 21:40
merci BruNews

j'ai fais comme tu m'a di avec les types dbl,dbl,long
mon fichier de 1.6 go et converti et fai 1.1 go
et c'est plus rapide a la lecture, c'est pa encore le top mais ca va

je vai voir pour indéxer le fichier par zone geographique comme ca
lorsqu'il y aura des zooms plus besoin de relire tout le fichier et de dessiner
les points que l'on ne voit pas.

merci

a+
0
Rejoignez-nous