03. marts 2003 - 10:51Der er
28 kommentarer og 1 løsning
Tegn billede tager MEGET ram ? Hvorfor ?
Hej alle, Jeg har lavet et lille styk kode som får et mappe og udefra den tegen billederne i et form. Billederne er 2160 x 1440 JPEG 24 bit farvedybte og fylder 1.5 MB styk.
Problemet er at programmet tager ca. 65 MB ram for at tegne 4 billeder. Kan det virkeligt være rigtigt ? Måske er der en anden måde at gøre tingene på så den ikke æder så meget ram.
Mvh. Mihai
int len = System.IO.Directory.GetFiles(@"C:\IMG","*.JPG").Length; String[] test = new string[len]; test = Directory.GetFiles(@"C:\IMG","*.JPG");
Graphics g = e.Graphics; int x = 0; int y = 0; int width = 120; int height = 120; int rX =10; int rY =10; int rW =120; int rH =120;
Rectangle destRect1; GraphicsUnit units = GraphicsUnit.Pixel;
for (int i=0; i<len; i++) { Image _image = Image.FromFile(test[i]); _image = _image.GetThumbnailImage(120,120,null, new IntPtr());
destRect1 = new Rectangle(rX,rY,rW,rH); e.Graphics.DrawImage(_image, destRect1, x, y, width, height, units); rX+=125; }
hmm men den skal være sådan ! Det jeg prøver er at lave et thumbnail on the fly udfra mit originale billeder så det er ikke aktuelt at gøre dem mindre men når du nu siger det så har jeg prøvet med nogle billeder som fyldte 65kb hver og der tog den vist 22 MB som jeg ser utrolig meget stadigvæk. Any comments ?
næ det burde det ikke.... tværtimod så burde den tage mindre... men det er jo fact at windows bare langer til sig hvad angår ram... men den der er svær for den burde ikke tage så mange ram... så jeg ved det sgu desværre ikke...
Der er nogen der siger at det er fordi den skal decompresse JPG billedet og derfpr vil den æde meget ram men helt ærligt that's bulshit. Hvad kan man så bruge .NET til hvis den laver så noget mærkelige ting. Jeg må indrømme at jeg ikke er videre begejstret af .NET frameworken. Det kører dårligt efter min mening.
Det kunne det godt være men hvordan fortæller man den at den ikke skal bruge rammen men HD ? Jeg er ret sikker på at den bruger rammen eftersom den æder så meget.
Nu er jeg ikke ved min maskine lige nu. Er på arb. men jeg er ret sikker på at den står til at cache på HD over et vist antal MB ram men det vil stadigvæk ikke ændre at programmet gerne vil æde så meget ram af sig selv.
ja det er ret mystisk men jeg nu sikker på at der er en forklaring. Der er bare ikke mere i koden end det jeg har postet så det er meget lidt den skal lave.
Dette er blot et bud: For at kunne skalere billedet ned, skal det først pakkes ud. 2160*1440*24/8 = 8.9MB. Hvis graphics objectet også indeholder andre data såsom Alpha kanal skal dette naturligvis medregnes. Undersøg selv, hvor meget hver pixel fylder i byes.
Hvis vi holder os til de "rå" data fylder de 4 billeder fylder således ca. 36MB. Dertil kommer en overhead fra klasser osv.
Jeg kommer til at tænke på et program vi lavede i Java engang, hvor vi fade billeder ind ved at sætte alpha kanalen fra 0-100% billedet var af thumbnail størrelse, men alligevel nåede programmet at bruge ca 60MB. Det viste sig, at garbage colletor processen blev udsultet, så den først fik lov at frigive hukommelsen når alle billeder var fadet ind. Dette blev løst med at kalde system.gc() i fade loopet. Du kan se om der findes noget tilsvarende i C#.
Alternativt kan du jo prøve at pille linie for linie ud af koden og se hvad det er, der bruger RAM'en.
Du har ret at det vil fylde meget men men jeg har prøvet at tegne billedet uden at lave et thumbnail af den først og det hjalp ikke ved ram problematikken.
Som benjams69 sige så SKULLE der gærne være garbage collector i C# sååå jeg ved ikke om problemet er der.
Nej det har jeg ikke men det kan jeg lige prøve når jeg kommer hjem lidt senere men det kunne være at det var en løsning. Det ville være lækkert hvis det er bare det.
ja jeg kører SP2 på WinXP og Visual .NET installerede jeg igår og den checkede selv om der var opdateringer og det var der ikke. Jeg kører Visual .NET 2003 Architecture 7.1 Final Beta.
Løsningen er at man SKAL garbage collecte. Den tager nu ca. 9 mb i hukkomelsen med 10 billeder så det er noget af en forskel. Jeg synes at jpvj skal have de fleste point men jeg vil gerne give chries lidt også da han kom med en færdigløsning men lav lige et svar så jeg kan få afsluttet spørsmålet.
øhh sorry chries men jeg har ikke brugt Eksperten i meget lang tid så jeg har glemt at man ikke kan ændre pointene mere såå jpvj du får det hele :) og endnu engang takker jeg.
Synes godt om
Ny brugerNybegynder
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.