Avatar billede milandt Nybegynder
30. november 2007 - 01:12 Der er 13 kommentarer og
1 løsning

optimering af delete files

Jeg har et stykke kode:

DirectoryInfo dirUpload = new DirectoryInfo(Config.GetAppSetting("Upload"));
foreach (FileInfo f in dirUpload.GetFiles("*" + _id + "*", SearchOption.AllDirectories))
    f.Delete();

Formålet er at slette alle filer der indeholder _id i deres navn, evt evt med et prefix eller et postfix. Filerne kan ligge i forskellige mapper som jeg ikke nødvendigvis kender navnet på. Der kan være flere hits, og ikke kun eet.

Ovenstående fungerer fint, men med 3-400.000 filer og et par hundrede mapper, så tager ovenstående kode altså temmelig lang tid at afvikle.

Hvordan kan det optimeres? - eller kan man gribe opgaven helt anderledes an?
Avatar billede nielle Nybegynder
01. december 2007 - 08:15 #1
Jeg har nu timet de forskellige sletning-algoritmer jeg kunne komme i tanke om (kan godt poste koden, men det fylder lidt meget). Din metode ovenfor ser hveken ud til at være specielt hurtig eller langsom i forhold til de andre. Jeg gætter derfor på at der et to faktore der bestemmer hastigheden:

1) Hvor hurtigt man kan finde filerne
2) Hvor hurtigt det tager at slette en enkelt fil.

Hvad begge faktore angår er din kode så hurtig som man kan forvente det.

MEN:

.NET's Delete() metoder sletter ikke til papirkurven. For at gøre det skal man have fat på noget DllImport; Jeg har dog ikke kigget på dette eftersom at det er min erfaring at det tager længere tid at slette til papirkurven end blot at slette helt.

Et alternativ du kunne overveje, er at flytte filerne til en anden folder (på samme drev!). Denne kunne du så slette senere via Windows. Jeg ved ikke om der er vundet noget ved dette - det smager i hvert fald lidt af at slete til papirkurven... Selvom jeg dog mener at der er mere overhead på det sidste.

Endnu et alternativ kunne være at slette filerne løbende som de oprettes i stedet for at gøre det i ét hug efter et stykke tid. Det ville få processen til at virke langt mindre tung. Nu ved jeg ikke hvor filerne kommer fra og om de skal bruges til noget før de slettes, så jeg ved ikke om dette er en farbar vej. Men hvis du vælger denne så kan det gøre ved at du opsætter en FileSystemWatcher til at kolde øje med dit upload-dir.

Du kunne måske finde lidt inspiration i dette her spørgsmål:

http://www.eksperten.dk/spm/805185
Avatar billede milandt Nybegynder
03. december 2007 - 22:35 #2
Først og fremmest mange tak for svaret - og undskyld den sene tilbagemelding.

Filerne findes hurtigt nok - når jeg kender den eksakte sti altså. En enkelt fil kan også slettes hurtigt uden problemer, når jeg bare vil slette een, og kender stien.

Jeg har et site med en masse billeder, og der findes thumbs i forskellige størrelser. Jeg kender kun stien og navnet på det originale billeder. feks [uniktnavn].jpg. Løbende oprettes der thumbnail billeder i forskellige størrelser, med navnet [uniktnavn]_[bredde]_[højde].jpg.

Derfor kan jeg søge på dirUpload.GetFiles("*" + _id + "*", SearchOption.AllDirectories) hvor _id er det unikke navn, og dermed få fat i billedet inkl thumbnails. Jeg har ingen registrering af hvilke thumbnail størrelser der findes for det enkelte billede.

Det virker som om at det er søgningen der tager tid, ikke så meget at slette billedet. Nogen måde jeg kan optimere det på?

Har tidligere haft en løsning hvor jeg flyttede filerne til en temp mappe, som blev slettet en gang i døgnet. Det var ikke hurtigere af den grund.
Avatar billede nielle Nybegynder
04. december 2007 - 06:50 #3
Jeg har som sagt ikke umiddelbart kunne finde nogen hurtigere måde...

Har du kigget på mit forslag om at bruge en FileSystemWatcher?

Forresten, hvis det er thumbnails, hvorfor skal de så slettes? Skal de ikke brues som de er?
Avatar billede milandt Nybegynder
04. december 2007 - 11:12 #4
Har ikke kigget nærmere på FileSystemWatcher, men det vil jeg gøre.

Jo, thumbs bliver brugt som de er, men når billedet skal slettes vil jeg gerne rydde op og fjerne diverse thumbnail billeder også. Har ikke mere at bruge dem til når det oprindelige billede er blevet slettet.
Avatar billede nielle Nybegynder
04. december 2007 - 19:10 #5
Hvorfor sletter du dem så ikke sammen med billedet?
Avatar billede milandt Nybegynder
05. december 2007 - 00:45 #6
Fordi jeg ikke har en liste over hvilke thumbs der findes. For at finde dem laver jeg følgende søgning

dirUpload.GetFiles("*" + _id + "*", SearchOption.AllDirectories)

Det er det der tager en evighed.
Avatar billede nielle Nybegynder
05. december 2007 - 17:30 #7
Kan thumb-navnet ikke udledes direkte af filnavnet på den fil der skal slettes?
Avatar billede nielle Nybegynder
05. december 2007 - 17:31 #8
... og ligger de ikke i samme bibliotek som filen der slettes?
Avatar billede milandt Nybegynder
06. december 2007 - 21:34 #9
Nej, thumb navnet kan ikke direkte udledes. Der kan være mange thumb navne, i forskellige størrelser. De er ikke registreret.

Det eneste jeg ved om dem er at navnet består af det samme Guid som det originale billede, efterfulgt af _width_height.ext.

Derfor jeg søger efter dem således: dirUpload.GetFiles("*" + _id + "*", SearchOption.AllDirectories)
Avatar billede nielle Nybegynder
06. december 2007 - 21:37 #10
Det lyder som om at der er basis for at hente effektivitet andre steder i programmet. :^)

Men ligger de i ikke i det mindste i samme bibliotek som selve billedet?
Avatar billede milandt Nybegynder
06. december 2007 - 21:54 #11
jo, det gør de trods alt.

.. kunne selvfølgelig være jeg skulle nøjes med at søge i det samme dir som det originale billede ligger, i stedet for fra roden af min upload folder..
Avatar billede nielle Nybegynder
06. december 2007 - 21:58 #12
Ja, og det vil ganske givet forbedre performance. Du bør endvidere undlade at søge rekursivt. :^)
Avatar billede milandt Nybegynder
06. december 2007 - 22:02 #13
det er nok det tætteste jeg kommer på en optimering. du må gerne lægge et svar, så prøver jeg ovenstående, og ser hvor meget det giver
Avatar billede nielle Nybegynder
06. december 2007 - 22:08 #14
Svar :^)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester