Je souhaite optimiser ce programme qui permet de compter le nombre de
fichier dans un repertoire.
set fso=new filesystemobject
set dossier=fso.getfolder("c:\photo")
for each fichier in dossier.files
nfiles=nfiles+1
redim preserve tableau(1 to nfiles)
sa=fichier
tableau(nfiles)=sa
next
for each sousdossier in dossier.subfolders
scan sousdossier
next
msgbox nfiles
Pour trouver 10000 fichiers, il mettait plus de 5 minutes
sur une machine Amd Athlon 64 3200+ avec 1 giga de ram
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Gilles MOUGNOZ
Bonjour, Toto Tu peux utiliser la propriété Count de la collection Files pour définir la dimension de ton tableau avant de rentrer dans la boucle: redim preserve tableau(1 to dossier.files.Count) C'est plus rapide ? -- Bonne continuation ------------------------------------------------------------------------------------------- "toto" a écrit :
Bonjour tout le monde,
Je souhaite optimiser ce programme qui permet de compter le nombre de fichier dans un repertoire.
set fso=new filesystemobject set dossier=fso.getfolder("c:photo") for each fichier in dossier.files nfiles=nfiles+1 redim preserve tableau(1 to nfiles) sa=fichier tableau(nfiles)=sa next for each sousdossier in dossier.subfolders scan sousdossier next
msgbox nfiles
Pour trouver 10000 fichiers, il mettait plus de 5 minutes sur une machine Amd Athlon 64 3200+ avec 1 giga de ram
merci d'avance
yann
Bonjour, Toto
Tu peux utiliser la propriété Count de la collection Files pour définir la
dimension de ton tableau avant de rentrer dans la boucle:
redim preserve tableau(1 to dossier.files.Count)
C'est plus rapide ?
--
Bonne continuation
-------------------------------------------------------------------------------------------
"toto" a écrit :
Bonjour tout le monde,
Je souhaite optimiser ce programme qui permet de compter le nombre de
fichier dans un repertoire.
set fso=new filesystemobject
set dossier=fso.getfolder("c:photo")
for each fichier in dossier.files
nfiles=nfiles+1
redim preserve tableau(1 to nfiles)
sa=fichier
tableau(nfiles)=sa
next
for each sousdossier in dossier.subfolders
scan sousdossier
next
msgbox nfiles
Pour trouver 10000 fichiers, il mettait plus de 5 minutes
sur une machine Amd Athlon 64 3200+ avec 1 giga de ram
Bonjour, Toto Tu peux utiliser la propriété Count de la collection Files pour définir la dimension de ton tableau avant de rentrer dans la boucle: redim preserve tableau(1 to dossier.files.Count) C'est plus rapide ? -- Bonne continuation ------------------------------------------------------------------------------------------- "toto" a écrit :
Bonjour tout le monde,
Je souhaite optimiser ce programme qui permet de compter le nombre de fichier dans un repertoire.
set fso=new filesystemobject set dossier=fso.getfolder("c:photo") for each fichier in dossier.files nfiles=nfiles+1 redim preserve tableau(1 to nfiles) sa=fichier tableau(nfiles)=sa next for each sousdossier in dossier.subfolders scan sousdossier next
msgbox nfiles
Pour trouver 10000 fichiers, il mettait plus de 5 minutes sur une machine Amd Athlon 64 3200+ avec 1 giga de ram
merci d'avance
yann
Vincent Guichard
toto a écrit :
Bonjour tout le monde,
Je souhaite optimiser ce programme qui permet de compter le nombre de fichier dans un repertoire.
set fso=new filesystemobject
fso est connu pour sa simplicité d'utilisation... et sa lenteur.
cf http://faq.vb.free.fr/index.php?question6
Vincent Guichard
toto a écrit :
Bonjour tout le monde,
Je souhaite optimiser ce programme qui permet de compter le nombre de
fichier dans un repertoire.
set fso=new filesystemobject
fso est connu pour sa simplicité d'utilisation... et sa lenteur.
Je souhaite optimiser ce programme qui permet de compter le nombre de fichier dans un repertoire.
set fso=new filesystemobject
fso est connu pour sa simplicité d'utilisation... et sa lenteur.
cf http://faq.vb.free.fr/index.php?question6
Vincent Guichard
jm
"toto" wrote in message news:4564257e$0$18803$
Bonjour tout le monde,
Hello,
Je souhaite optimiser ce programme qui permet de compter le nombre de fichier dans un repertoire.
OK.
set fso=new filesystemobject set dossier=fso.getfolder("c:photo") for each fichier in dossier.files nfiles=nfiles+1 redim preserve tableau(1 to nfiles)
STOP !!!
Pas la peine d'aller plus loin, tout le problème est ici. Redim preserve est extrèmement lent.
En plus de ce qu'on déjà signalé les autres (éviter FSO), la solution consiste à préallouer tableau, ou alors à l'allouer par blocs.
Voici une fonction qui fait cela:
Option Explicit
Private Const ARRAY_GROW_FACTOR As Long = 2 Private Const ARRAY_INITIAL_SIZE As Long = 1
Private Function CountFiles(ByVal filesPattern As String, _ ByRef filesArray() As String) As Long Dim fileName As String Dim numberFiles As Long Dim sizeArray As Long
Toute l'astuce est d'allouer à chaque fois que tu as besoin en grossissant d'un facteur 2 à chauqe fois. Tu vas donc allouer: 2, 4, 8, 16, 32, 64, 128, 256, 512, ..., 16384, 32768
En tout, tu ne vas faire que 16 ou 17 "Redim Preserve", au lieu de 10000 ou 20000.
Pour un répertoire contenant 20000 fichiers, c'est si rapide que je ne peux pas mesurer "à la main".
"toto" <simcity1969@yahoo.fr> wrote in message
news:4564257e$0$18803$426a74cc@news.free.fr...
Bonjour tout le monde,
Hello,
Je souhaite optimiser ce programme qui permet de compter le nombre de
fichier dans un repertoire.
OK.
set fso=new filesystemobject
set dossier=fso.getfolder("c:photo")
for each fichier in dossier.files
nfiles=nfiles+1
redim preserve tableau(1 to nfiles)
STOP !!!
Pas la peine d'aller plus loin, tout le problème
est ici. Redim preserve est extrèmement lent.
En plus de ce qu'on déjà signalé les autres (éviter FSO),
la solution consiste à préallouer tableau, ou alors à l'allouer
par blocs.
Voici une fonction qui fait cela:
Option Explicit
Private Const ARRAY_GROW_FACTOR As Long = 2
Private Const ARRAY_INITIAL_SIZE As Long = 1
Private Function CountFiles(ByVal filesPattern As String, _
ByRef filesArray() As String) As Long
Dim fileName As String
Dim numberFiles As Long
Dim sizeArray As Long
Toute l'astuce est d'allouer à chaque fois que tu as besoin
en grossissant d'un facteur 2 à chauqe fois.
Tu vas donc allouer:
2, 4, 8, 16, 32, 64, 128, 256, 512, ..., 16384, 32768
En tout, tu ne vas faire que 16 ou 17 "Redim Preserve", au lieu
de 10000 ou 20000.
Pour un répertoire contenant 20000 fichiers, c'est si rapide
que je ne peux pas mesurer "à la main".
Je souhaite optimiser ce programme qui permet de compter le nombre de fichier dans un repertoire.
OK.
set fso=new filesystemobject set dossier=fso.getfolder("c:photo") for each fichier in dossier.files nfiles=nfiles+1 redim preserve tableau(1 to nfiles)
STOP !!!
Pas la peine d'aller plus loin, tout le problème est ici. Redim preserve est extrèmement lent.
En plus de ce qu'on déjà signalé les autres (éviter FSO), la solution consiste à préallouer tableau, ou alors à l'allouer par blocs.
Voici une fonction qui fait cela:
Option Explicit
Private Const ARRAY_GROW_FACTOR As Long = 2 Private Const ARRAY_INITIAL_SIZE As Long = 1
Private Function CountFiles(ByVal filesPattern As String, _ ByRef filesArray() As String) As Long Dim fileName As String Dim numberFiles As Long Dim sizeArray As Long
Toute l'astuce est d'allouer à chaque fois que tu as besoin en grossissant d'un facteur 2 à chauqe fois. Tu vas donc allouer: 2, 4, 8, 16, 32, 64, 128, 256, 512, ..., 16384, 32768
En tout, tu ne vas faire que 16 ou 17 "Redim Preserve", au lieu de 10000 ou 20000.
Pour un répertoire contenant 20000 fichiers, c'est si rapide que je ne peux pas mesurer "à la main".
Après réflexion, il semble que dans ton cas la lenteur vienne vraiment de FSO, car même si il reste vrai que Redim Preserve est très lent, ça ne suffisait pas à expliquer une telle lenteur.
-- Jean-marc
"jm" <jean_marc_n2@yahoo.fr> wrote in message
news:45644928$0$31463$ba620e4c@news.skynet.be...
"toto" <simcity1969@yahoo.fr> wrote in message
news:4564257e$0$18803$426a74cc@news.free.fr...
Bonjour tout le monde,
Après réflexion, il semble que dans ton cas la
lenteur vienne vraiment de FSO, car même si il
reste vrai que Redim Preserve est très lent, ça
ne suffisait pas à expliquer une telle lenteur.
Après réflexion, il semble que dans ton cas la lenteur vienne vraiment de FSO, car même si il reste vrai que Redim Preserve est très lent, ça ne suffisait pas à expliquer une telle lenteur.
-- Jean-marc
toto
bonjour,
j'ai oublié de préciser que le programme FSO cherche dans tous les sous répertoires.
"jm" a écrit dans le message de news: 4564570f$0$1133$
"jm" wrote in message news:45644928$0$31463$
"toto" wrote in message news:4564257e$0$18803$
Bonjour tout le monde,
Après réflexion, il semble que dans ton cas la lenteur vienne vraiment de FSO, car même si il reste vrai que Redim Preserve est très lent, ça ne suffisait pas à expliquer une telle lenteur.
-- Jean-marc
bonjour,
j'ai oublié de préciser que le programme FSO cherche dans tous les sous
répertoires.
"jm" <jean_marc_n2@yahoo.fr> a écrit dans le message de news:
4564570f$0$1133$ba620e4c@news.skynet.be...
"jm" <jean_marc_n2@yahoo.fr> wrote in message
news:45644928$0$31463$ba620e4c@news.skynet.be...
"toto" <simcity1969@yahoo.fr> wrote in message
news:4564257e$0$18803$426a74cc@news.free.fr...
Bonjour tout le monde,
Après réflexion, il semble que dans ton cas la
lenteur vienne vraiment de FSO, car même si il
reste vrai que Redim Preserve est très lent, ça
ne suffisait pas à expliquer une telle lenteur.
j'ai oublié de préciser que le programme FSO cherche dans tous les sous répertoires.
"jm" a écrit dans le message de news: 4564570f$0$1133$
"jm" wrote in message news:45644928$0$31463$
"toto" wrote in message news:4564257e$0$18803$
Bonjour tout le monde,
Après réflexion, il semble que dans ton cas la lenteur vienne vraiment de FSO, car même si il reste vrai que Redim Preserve est très lent, ça ne suffisait pas à expliquer une telle lenteur.
-- Jean-marc
jm
Hello,
Très facile à faire avec Dir$() aussi. Des tas d'exemples existent sur Internet.
-- Jean-marc
"toto" wrote in message news:4565722f$0$17494$
bonjour,
j'ai oublié de préciser que le programme FSO cherche dans tous les sous répertoires.
"jm" a écrit dans le message de news: 4564570f$0$1133$
"jm" wrote in message news:45644928$0$31463$
"toto" wrote in message news:4564257e$0$18803$
Bonjour tout le monde,
Après réflexion, il semble que dans ton cas la lenteur vienne vraiment de FSO, car même si il reste vrai que Redim Preserve est très lent, ça ne suffisait pas à expliquer une telle lenteur.
-- Jean-marc
Hello,
Très facile à faire avec Dir$() aussi. Des tas d'exemples existent
sur Internet.
--
Jean-marc
"toto" <simcity1969@yahoo.fr> wrote in message
news:4565722f$0$17494$426a74cc@news.free.fr...
bonjour,
j'ai oublié de préciser que le programme FSO cherche dans tous les sous
répertoires.
"jm" <jean_marc_n2@yahoo.fr> a écrit dans le message de news:
4564570f$0$1133$ba620e4c@news.skynet.be...
"jm" <jean_marc_n2@yahoo.fr> wrote in message
news:45644928$0$31463$ba620e4c@news.skynet.be...
"toto" <simcity1969@yahoo.fr> wrote in message
news:4564257e$0$18803$426a74cc@news.free.fr...
Bonjour tout le monde,
Après réflexion, il semble que dans ton cas la
lenteur vienne vraiment de FSO, car même si il
reste vrai que Redim Preserve est très lent, ça
ne suffisait pas à expliquer une telle lenteur.
Très facile à faire avec Dir$() aussi. Des tas d'exemples existent sur Internet.
-- Jean-marc
"toto" wrote in message news:4565722f$0$17494$
bonjour,
j'ai oublié de préciser que le programme FSO cherche dans tous les sous répertoires.
"jm" a écrit dans le message de news: 4564570f$0$1133$
"jm" wrote in message news:45644928$0$31463$
"toto" wrote in message news:4564257e$0$18803$
Bonjour tout le monde,
Après réflexion, il semble que dans ton cas la lenteur vienne vraiment de FSO, car même si il reste vrai que Redim Preserve est très lent, ça ne suffisait pas à expliquer une telle lenteur.