|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Jeremy Ingénieur ferroviaire Inscription : mai 2011 Messages : 9 ![]() |
Bonjour,
Je développe actuellement une macro Excel qui analyse des enregistrements binaires (enregistrements ayant lieu à bord de métros). Chaque enregistrement est un fichier qui comporte une entête suivie de trames de données de taille fixe. Je cherche à accélérer ma macro qui est lente pour la raison suivante : je ne sais pas lire un fichier à partir d'un certain offset. Je sais uniquement commencer sa lecture au premier octet, et lire octet par octet jusqu'à atteindre l'octet qui m'intéresse. L'extrait de code ci-dessous reflète ce que je fais : Code :
J'ai déjà cherché par ci et par là, googlisé, mais je ne trouve rien de concret. Souvent, je tombe sur du VB.NET mais je ne sais pas comment linker ça avec VBA. A vos suggestions, et merci par avance pour votre aide ! Jérémy |
||
|
|
00
|
|
|
#2 | ||
|
Office & Excel ![]() ![]() ![]() |
Bonjour
Normalement, tu peux déterminer le nombre d'octets à lire en premier paramètre de la fonction. Pourrais-tu essayer ceci? Code :
__________________
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire) --------------- Ma nouvelle vidéo: comparer des listes via une MFC - Mes articles sur DVP Vous souhaitez rédiger pour DVP? Contactez-moi Amoureux de la langue française? Venez corriger nos ressources VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA... N'oubliez pas de VOTER (en bas à droite d'un message) --------------- |
||
|
00
|
|
|
#3 |
|
Invité de passage
![]() Jeremy Ingénieur ferroviaire Inscription : mai 2011 Messages : 9 ![]() |
Merci pour ta réponse.
Je pense que cela ne résout pas mon problème : cette commande me permet de non plus faire de la lecture octet par octet, mais N octets par N octets. La lecture commence cependant toujours au début du fichier. Ce que je cherche à faire, c'est lire N octets directement à partir du i-ème OCTET, sans avoir à lire le début. |
|
|
00
|
|
|
#4 |
|
Office & Excel ![]() ![]() ![]() |
Ca, tu ne peux pas faire.
Tu dois "éliminer" les x premiers octets en les lisant, quitte à les mettre dans une variable dont tu ne te sers pas. Simplement, tu ne lis pas les x premiers octets un à un dans une boucle, mais tu les évacues en une seule ligne. La lecture d'un fichier binaire comme ici est toujours séquentielle, et au final, tu auras lu tout ton fichier.
__________________
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire) --------------- Ma nouvelle vidéo: comparer des listes via une MFC - Mes articles sur DVP Vous souhaitez rédiger pour DVP? Contactez-moi Amoureux de la langue française? Venez corriger nos ressources VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA... N'oubliez pas de VOTER (en bas à droite d'un message) --------------- |
|
00
|
|
|
#5 |
|
Invité de passage
![]() Jeremy Ingénieur ferroviaire Inscription : mai 2011 Messages : 9 ![]() |
Ce que je souhaite faire n'est donc pas possible. Merci à toi pour tes réponses en tout cas. Je dois changer de langage si je veux pouvoir faire cela j'imagine ?
|
|
|
00
|
|
|
#6 |
|
Office & Excel ![]() ![]() ![]() |
Je ne comprends pas en quoi c'est gênant de lire d'abord les x premiers octets "d'un seul coup" même si ce n'est pas utile, mais tu as sûrement de bonnes raisons de ne pas accepter cette solution...
__________________
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire) --------------- Ma nouvelle vidéo: comparer des listes via une MFC - Mes articles sur DVP Vous souhaitez rédiger pour DVP? Contactez-moi Amoureux de la langue française? Venez corriger nos ressources VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA... N'oubliez pas de VOTER (en bas à droite d'un message) --------------- |
|
00
|
|
|
#7 |
|
Invité de passage
![]() Jeremy Ingénieur ferroviaire Inscription : mai 2011 Messages : 9 ![]() |
En fait, je traite des centaines de gigas de binaires et toute lecture inutile me fait perdre du temps, voilà tout
|
|
|
00
|
|
|
#8 | ||
![]() ![]() Inscription : septembre 2003 Messages : 4 300 ![]() |
bjr,
voir les API CreateFile, SetFilePointer, ReadFile, CloseHandle un exemple : Code :
__________________
Assistant de création/modification de rubans Office Utilisez en VBA les librairies graphiques GDI, GDI+ et openGL Blog Office Mon Site DVP |
||
|
|
10
|
|
|
#9 |
|
Office & Excel ![]() ![]() ![]() |
Salut Arkham,
Ne penses-tu pas que InputB est simplement "la couche VBA" de l'api, et donc, qu'elle utilise l'api? Dès lors, je pense (je n'en sais rien, c'est juste une réflexion) que l'api "lit" aussi les octets de début de fichier. Ton avis?
__________________
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire) --------------- Ma nouvelle vidéo: comparer des listes via une MFC - Mes articles sur DVP Vous souhaitez rédiger pour DVP? Contactez-moi Amoureux de la langue française? Venez corriger nos ressources VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA... N'oubliez pas de VOTER (en bas à droite d'un message) --------------- |
|
00
|
|
|
#10 | |
![]() ![]() Inscription : septembre 2003 Messages : 4 300 ![]() |
Citation:
Pour avancer dans le fichier, le problème c'est qu'on est obligé (j'en ai l'impression) avec les fonctions VBA de lire le contenu et de le stocker quelque part, même temporairement. Le SetFilePosition ne fait que déplacer un pointeur sans besoin de stocker le début du fichier pour aller lire la fin (j'en ai l'impression aussi, ce n'est pas toujours très clair avec la API). Si c'est pour aller lire le 50000 ème octet d'un fichier, ce sera plus rapide C'est à comparer sur un cas réel avec des gros fichiers ...
__________________
Assistant de création/modification de rubans Office Utilisez en VBA les librairies graphiques GDI, GDI+ et openGL Blog Office Mon Site DVP |
|
|
|
10
|
|
|
#11 |
|
Office & Excel ![]() ![]() ![]() |
Merci de l'éclairage.
__________________
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire) --------------- Ma nouvelle vidéo: comparer des listes via une MFC - Mes articles sur DVP Vous souhaitez rédiger pour DVP? Contactez-moi Amoureux de la langue française? Venez corriger nos ressources VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA... N'oubliez pas de VOTER (en bas à droite d'un message) --------------- |
|
00
|
|
|
#12 |
|
Invité de passage
![]() Jeremy Ingénieur ferroviaire Inscription : mai 2011 Messages : 9 ![]() |
Merci beaucoup pour vos réponses les gars. Je teste demain et vous tien au courant. Cette fonction pour positionner le curseur risque de me faire gagner beaucoup de temps de traitement.
|
|
|
00
|
|
|
#13 |
|
Invité de passage
![]() Jeremy Ingénieur ferroviaire Inscription : mai 2011 Messages : 9 ![]() |
Je suis en train d'adapter ce bout de code à mon programme, avec un peu de retard
En revanche, je me pose une question du point de vue rapidité du temps de traitement : Est-il équivalent au niveau temps de traitement de faire : 1) un ReadFile qui lit 30 caractères d'un coup à partir du début/de l'adresse spécifiée dans le file pointer plutot que 2) 30 * ( Lecture d'un caractère puis SetFilePointer au caractère suivant) La solution 2) est plus simple de mise en oeuvre pour l'algorithme de post-traitement des données, mais consomme-t-elle plus de temps ? De façon plus "philosophique", je me dit que ce qui bouffe du temps de traitement, c'est l'accès au disque. Est-ce que l'exécution de la commande SetFilePointer requiert un accès au disque, ou est-ce une simple opération mémoire d'affectation d'adresse dans une variable mémoire ? Est-ce que la lecture directe de 30 caractère engendre implicitement la même chose (30x l'opération SetFilePointer) ? Merci pour votre aide sur ce sujet légèrement pointu |
|
|
00
|
|
|
#14 | |
![]() ![]() Inscription : septembre 2003 Messages : 4 300 ![]() |
Citation:
essaye de faire 1 million de SetFilePointer et regarde si la led du disque dur clignote ![]() faut essayer pour voir...
__________________
Assistant de création/modification de rubans Office Utilisez en VBA les librairies graphiques GDI, GDI+ et openGL Blog Office Mon Site DVP |
|
|
|
10
|
|
|
#15 |
|
Invité de passage
![]() Jeremy Ingénieur ferroviaire Inscription : mai 2011 Messages : 9 ![]() |
Pas bête. Merci
|
|
|
00
|
|
|
#16 |
|
Invité de passage
![]() Jeremy Ingénieur ferroviaire Inscription : mai 2011 Messages : 9 ![]() |
Après implémentation de mon code, j'ai constaté qu'il était largement plus rapide de changer la position du curseur de lecture pour lire ce que je désirais plutôt que de tout lire et ensuite prendre les quelques infos qui m'intéressaient. Ne donc pas hésiter à utiliser la fonction SetFilePointer plusieurs milliers de fois par fichier sur des gros traitements, cela fait gagner du temps.
|
|
|
10
|
|
|
#17 |
|
Office & Excel ![]() ![]() ![]() |
Merci pour ce retour très instructif...
__________________
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire) --------------- Ma nouvelle vidéo: comparer des listes via une MFC - Mes articles sur DVP Vous souhaitez rédiger pour DVP? Contactez-moi Amoureux de la langue française? Venez corriger nos ressources VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA... N'oubliez pas de VOTER (en bas à droite d'un message) --------------- |
|
00
|
|
|
#18 |
|
Invité de passage
![]() Jeremy Ingénieur ferroviaire Inscription : mai 2011 Messages : 9 ![]() |
Merci surtout à vous pour votre aide sur cette question un poil technique
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com