Toon posts:

[ASP] Recursief bestanden zoeken en tellen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi, ik heb een scriptje gemaakt om JPEG bestanden te tellen in een map, inclusief alle onderliggende mappen. Dat is het volgende scriptje:

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
FUNCTION CountJpegRecursive(Folder, InitCount)
  CountJpeg = InitCount
  xThisFolder = Folder & "/"

  SET xMyFolder = FileSystem.GetFolder(Server.MapPath(xThisFolder))

  FOR EACH xSubFolder IN xMyFolder.SubFolders
    IF xSubFolder.Name <> "src" AND xSubFolder.Name <> "template" THEN CountJpeg = CountJpegRecursive(xThisFolder & xSubFolder.Name, CountJpeg)
  NEXT

  FOR EACH xFile IN xMyFolder.Files
    IF LCase(Right(xFile.Name, 4)) = ".jpg" THEN CountJpeg = CountJpeg + 1
  NEXT

  CountJpegRecursive = CountJpeg
END FUNCTION


Het script werkt prima, maar is erg traag. Ik tel op dit moment twee folders met daarin 150 foto's in een stuk of 10 subfolders, en daar doet hij 2 tot 3 seconden over. Het laden van de pagina is dus erg langzaam. Iemand een idee of ik iets fout doe of kan verbeteren?

  • Paul C
  • Registratie: Juni 2002
  • Laatst online: 14:55
Ik ben welliswaar een leek op het gebied van ASP, maar ik zou als ik zelf zo'n probleem had beginnen om op verschillende momenten in je script Debug info te printen in de vorm van een gedetaileerde timestamp, dan kun je precies aflezen wat er traag is aan je script. Als je dat dan weet, dan kun je gericht naar een oplossing zoeken.

  • Dysmael
  • Registratie: Januari 2002
  • Laatst online: 01-08-2019
Enige wat ik kan bedenken is je oplossing in low-level zoeken.
Stukje ASM i.c.m. INT21H of zelfs INT13H
Heel misschien behaal je iets snelheidswinst met C i.p.v. VBScript maar ik betwijfel of dat afdoende verschil zal maken.
DLL van een EXE maken die pre-loaded is scheelt heel misschien ook wel iets inderdaad ;-)

  • Alex
  • Registratie: Juli 2001
  • Laatst online: 08-02 12:48
Hoogstwaarschijnlijk is het gebruik van eht fileSystem-object de bottleneck. Probeer eens of je daar niets anders voor kunt vinden, dus bijv die als ref meegeven ipv steeds een nieuwe? Objecten zijn in VbScript _altijd_ zwaar...

Deze post is bestemd voor hen die een tegenwoordige tijd kunnen onderscheiden van een toekomstige halfvoorwaardelijke bepaalde subinverte plagiale aanvoegend intentioneel verleden tijd.
- Giphart


  • vogeltje
  • Registratie: December 2001
  • Laatst online: 10-08-2025
Recursieve functies staan doorgaans nou ook niet echt bekend als snelheidsmonsters.
Ik zou je functie herschrijven met een normale while-loop en dan nog eens kijken naar de performance.

// ff kort
ASP:
1
2
3
4
5
while (current_dir_has_files)
  // testen of het huidige bestand voldoet aan jouw condities
  // waarschijnlijk wil je hier ook controleren of de huidige directory nog sub dir's heeft
  // etc....
wend


Dit is maar een hersenspinsel, succes ermee.

[ Voor 5% gewijzigd door vogeltje op 29-10-2006 17:06 ]

binnenkort een hele dikke casemod :P


Verwijderd

Topicstarter
Ik zal eens kijken of ik het in een executable kan stoppen.
En anders helaas maar in een database alles bijhouden.

Het filesystem zou het opzich wel snel moeten kunnen?

[ Voor 19% gewijzigd door Verwijderd op 29-10-2006 17:14 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 16:51

gorgi_19

Kruimeltjes zijn weer op :9

Het filesystem zal wel snel zijn; de koppeling naar FSO zal niet al te vlot zijn, of het componentje zelf.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Gert
  • Registratie: Juni 1999
  • Laatst online: 05-12-2025
In plaats van de LCase en Right zou je al GetExtensionName kunnen gebruiken, scheelt alicht wat aangezien string operaties in VBScript traag zijn.
Ook roep je steeds Server.MapPath aan, als je eenmaal weet wat het pad is hoef je dat niet elke keer nog eens te controlleren. Je kan met BuildPath een pad opbouwen.

  • pjonk
  • Registratie: November 2000
  • Laatst online: 29-12-2025
Staan de JPG's geserveerd op dezelfde server anders zou het misschien aan een trage netwerkconnectie kunnen liggen.
In ASP heb je voor FileSystemObject geen alternatieven. Wat je wel kunt doen is in VB6 een COM component maken die het werk voor je doet. Zorg ervoor dat je voor het bepalen van de files de FindFirstFile functie uit de WIN32 API gebruikt. Deze is bloedje snel en waarschijnlijk een stuk efficienter dan de GetFolder equivalent van FSO. Hieronder een voorbeeld:
http://www.tutorialized.c...om-Visual-Basic-code/5285

Ondanks de geringe COM overhead heb je een goede kans dat de performance flink wordt verbeterd.

It’s nice to be important but it’s more important to be nice


  • Xenan
  • Registratie: Augustus 2003
  • Laatst online: 31-01 20:16

Xenan

Tree-of-life

Zo'n functie zou in een fractie van een seconde klaar kunnen zijn. VBScript is echter zeer traag.

Waarom ASP en niet ASP.NET? Ditzelfde stukje code in C# of VB7 zal veel sneller zijn.
Enige wat ik kan bedenken is je oplossing in low-level zoeken.
Stukje ASM i.c.m. INT21H of zelfs INT13H
Heel misschien behaal je iets snelheidswinst met C i.p.v. VBScript maar ik betwijfel of dat afdoende verschil zal maken.
DLL van een EXE maken die pre-loaded is scheelt heel misschien ook wel iets inderdaad ;-)
Dit is echt onzin. Zo low level hoef je echt niet te gaan. Ik zou haast denken dat je een grapje maakt. Zelf heb ik recursieve functies in C# geschreven die in een seconde ofzo duizenden files genereert, je merkt amper dat je moet wachten.

Canon EOS 350D | EF-S 18-55mm | EF-S 60mm f/2.8 USM Macro | EF 70-300mm f/4-5.6 IS USM


Verwijderd

Topicstarter
Hi,

Bedankt voor jullie reacties :)

> De LCase() en Right() functies kosten misschien wel tijd, maar ik denk om eerlijk te zijn niet dat het probleem vooral door deze functies komen. Ik denk dat, zoals eerder al gezegd, het FileSystemObject de grootste bottleneck is.
> Het gaat niet via het netwerk, dus dat is het niet
> Ik gebruik ASP/VBScript omdat ik daar goed in ben, met ASP.NET ben ik nog te nieuw

Ik zal eens kijken naar de gegeven oplossingen en misschien eens proberen om externe applicatie of COM object te gebruiken. Ik laat het nog wel even weten.
Pagina: 1