Membres inscrits :599
Membres en ligne : 0
Invités en ligne : 10


|
| Conversation : Recuperer la date de modification d'un fichier -> Optimisation ? |
Patou (Nouveau membre)
Inscrit le : 29-01-2010
Messages: 3
Snippets: 0
Tutoriels: 0
Hors ligne |
Bonjour à tous !
Je me suis remis recemment a wxWidgets pour un petit projet permettant de synchroniser les fichiers entre 2 repertoires.
Pour cela je parcoures l'arborescence du repertoire via un object wxDir en notant la date de modification de chaque fichier afin de comparer cette date avec le meme fichier de l'autre repertoire...
La date de modification d'un fichier est recupérée en utilisant wxFileModificationTime, j'ai egalement essayé wxFileName::GetModificationTime, mais le constat est le meme, cette fonctionnalite ralentie horriblement le programme ! On passe de quelques secondes d'execution si je desactives cette fonctionnalite, a plusieurs minutes quand elle est activée ! Pourtant d'autres programmes de synchronisation sont bien plus rapide et font la meme chose... Je m'y prends si mal que ca ? A noter qu'une fois le repertoire est parcouru, la prochaine analyze est quasi instantanée, comme si un cache était utilisé...
Merci d'avance pour vos lumieres ! Patou
| |
|
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1147
Snippets: 23
Tutoriels: 6
Site web
Hors ligne |
Le fait que l'exécution soit ralentie est normal (il y a un accès à chaque fichier en plus). Mais apparemment, la différence est énorme. Est-ce qu'il y a beaucoup de fichiers à traiter ?
Quelle méthode utilises-tu pour parcourir l'arborescence du répertoire à synchroniser ? wxDir::Traverse, wxDir::GetAllFiles ou wxDir::GetFirst / wxDir::GetNext ?
|
Le nouveau portail wxWidgets francophone : www.wxdev.fr Ben en fait, vous y êtes déjà...
|
Patou (Nouveau membre)
Inscrit le : 29-01-2010
Messages: 3
Snippets: 0
Tutoriels: 0
Hors ligne |
Bonjour Xaviou,
Merci pour ta reponse ! La difference est enorme, c'est dans le cas ou il y a plusieurs milliers de fichiers a traiter.
Je parcours l'arborescence avec wxDir::GetFirst / wxDir::GetNext, pour la recréer en memoire, afin d'analyser ensuite les changements (fichiers supprimes, modifiés, etc..) et cette partie est assez rapide si au lieu de de recuperer la date de modification je créé un wxDateTime avec le constructeur par defaut par exemple.
J'ai teste une autre methode avec un appel a ::CreateFile et ::GetFileTime (sous windows ), mais le probleme reste entier... Quand je vois d'autres outils qui lisent la meme arborescence en quelques secondes, je me dis qu'il doit bien y avoir un moyen !  Et ce qui est surprenant c'est qu'une fois l'arborescence lue, si j'effaces et que je recommences, ca ne prendra plus quelques minutes, mais seulement quelques secondes ! C'est toujours la premiere lecteure apres branchement du disque externe, mais comme on fait rarement plusieurs synchronisations de suite c'est aussi la plus importante ! ---------- Re-Bonjour à tous !
Bon, je me réponds tout seul 
En fait, la solution qui fait appel a ::CreateFile et ::GetFileTime sous windows fonctionne très bien !
J'ai mal copié le nom dans mon #ifdef, du coup ce code n'etait jamais compilé... Bravo Patou, bien joué ! 
Par contre, pas encore de solution pour les autres OS.
Patou
Dernière modification par Patou (29-01-2010 19:41:36)
| |
|
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1147
Snippets: 23
Tutoriels: 6
Site web
Hors ligne |
J'ai jeté un coup d'oeil aux sources de FreeFilesSync qui est une application de synchronisation de dossiers codée avec wxWidgets.
Apparement, ils n'utilisent pas les fonctions wxWidgets pour lire la date de modification d'un fichier. Je pense même qu'ils utilisent la lib "boost" pour cela.
Il y a malgré tout une utilisation de ::GetFileTime pour Windows (et un équivaent pour Linux), mais ça ne concerna pas directement la comparaison des fichiers : uniquement les dossiers. Tu peux quand même vérifier si ça te chante... (fichier shared\fileHandling.cpp, méthode FreeFileSync::copyFileTimes).
Si tu trouves une méthode vraiment efficace, rapide, et éventuellement portable, tu peux toujours nous en faire profiter... 
@+ Xav'
|
Le nouveau portail wxWidgets francophone : www.wxdev.fr Ben en fait, vous y êtes déjà...
|
Patou (Nouveau membre)
Inscrit le : 29-01-2010
Messages: 3
Snippets: 0
Tutoriels: 0
Hors ligne |
Bonjour Xaviou, merci beaucoup pour tous ces efforts !
Il se trouve que j'avais regardé dans ce même code aussi, pour voir comment ils s'y prenaient, puisque ce programme est très rapide à l'éxecution, et c'est de là que j'avais repris l'utilisation de ::CreateFile et ::GetFileTime (bouh le vilain copieur !) pour windows.
Leur code est un mélange de boost, de wxWidgets, et il y a même des appels dépendants de l'OS à tout bout de champ qui sont cloisonnés via des instructions au préprocesseur (#ifdef _OS_MACHIN_, etc...), mais au moins c'est très efficace 
Dommage qu'il n'y ai pas de solution 100% wxWidgets qui soit aussi performante. Pour le moment je vais déjà terminer l'appli, je tacherais ensuite de trouver une solution efficace pour tous les OS. Je n'oublierais pas de vous en faire part !
Encore merci pour ton aide Xaviou, et à très bientôt je penses 
Bon week end à tous !
| |
|
|