Avatar billede donnib Praktikant
03. marts 2003 - 10:51 Der 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;
}
Avatar billede benjams69 Nybegynder
03. marts 2003 - 10:53 #1
Hypotese: Et billede i den opløsning kræver meget! Hvis du satte den ned, vil de med garanti IKKE tage så meget ram...
Avatar billede donnib Praktikant
03. marts 2003 - 10:56 #2
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 ?

Mihai
Avatar billede benjams69 Nybegynder
03. marts 2003 - 11:01 #3
Hmm - er det sådan at laver et thumb. på 65kb, og når det thumb. loades, fylder det 22mb eller er jeg helt galt på den...?
Avatar billede morten_leth Nybegynder
03. marts 2003 - 11:04 #4
benjams69 du er lidt gal på den for det er hvor mange ram den tager... hvor mange ram har du i mihaimarinescu????
Avatar billede donnib Praktikant
03. marts 2003 - 11:04 #5
Hvis jeg har 4 billeder som hver fylder 65kb og derefter prøver at køre programemt på dem så vil programmet fylde ca. 22 MB i hukkomelsen.
Avatar billede donnib Praktikant
03. marts 2003 - 11:05 #6
jeg har 256 MB. Gør det da noget forskel ? Det burde ikke gøre noget efter mit logik.
Avatar billede morten_leth Nybegynder
03. marts 2003 - 11:07 #7
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...
Avatar billede donnib Praktikant
03. marts 2003 - 11:08 #8
Jeg har prøvet at lave et FileStream derefter lægge tingene i et MemoryStream men lige lidt hjalp det.
Avatar billede donnib Praktikant
03. marts 2003 - 11:10 #9
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.
Avatar billede benjams69 Nybegynder
03. marts 2003 - 11:11 #10
Kunne det tænkes at du catcher billederne det forkerte sted?! I rammen og IKKE på din hdd?!
Avatar billede donnib Praktikant
03. marts 2003 - 11:12 #11
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.
Avatar billede benjams69 Nybegynder
03. marts 2003 - 11:13 #12
OS?!
Avatar billede donnib Praktikant
03. marts 2003 - 11:14 #13
WinXP PRO
Avatar billede benjams69 Nybegynder
03. marts 2003 - 11:17 #14
Tjek lige: højreklik på My Comp -> properties -> og så under advanced... Der er vist noget med catch etc (sidder ikke lige ved en XP maskine...)
Avatar billede donnib Praktikant
03. marts 2003 - 11:20 #15
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.
Avatar billede benjams69 Nybegynder
03. marts 2003 - 11:25 #16
hmm - måske har du ret... Det er lidt svært af forholde sig til, når man ikke lige kan se problemet (visuelt)...
Avatar billede donnib Praktikant
03. marts 2003 - 11:26 #17
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.
Avatar billede benjams69 Nybegynder
03. marts 2003 - 11:32 #18
Gad vide om det er fordi du "puller" dit billede... og at den så catcher alle billerne (fra test[i]) - Hey, i dunno :D
Avatar billede benjams69 Nybegynder
03. marts 2003 - 11:33 #19
hov - slet lige den forrige del.... Jeg var lidt skæv der :)
Avatar billede jpvj Nybegynder
03. marts 2003 - 11:34 #20
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.

JP
Avatar billede benjams69 Nybegynder
03. marts 2003 - 11:37 #21
Jamen så vidt jeg ved, dumper C selv det der...
Avatar billede donnib Praktikant
03. marts 2003 - 11:54 #22
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.
Avatar billede chries Nybegynder
03. marts 2003 - 13:10 #23
Har du prøvet at garbage collecte efter billedet er konverteret ?

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemgcclasscollecttopic1.asp
destRect1 = new Rectangle(rX,rY,rW,rH);

....
e.Graphics.DrawImage(_image, destRect1, x, y, width, height, units);
rX+=125;
}

System.GC.Collect();
....
Avatar billede donnib Praktikant
03. marts 2003 - 13:14 #24
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.
Avatar billede chries Nybegynder
03. marts 2003 - 13:19 #25
Kører du nyeste service pack?

Der vist også noget med en bug og store objekter:
http://discuss.develop.com/archives/wa.exe?A2=ind0208B&L=DOTNET-CLR&P=R4211&I=-3
Avatar billede donnib Praktikant
03. marts 2003 - 13:24 #26
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.
Avatar billede donnib Praktikant
03. marts 2003 - 18:50 #27
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.

Tak for hjælpen
Avatar billede jpvj Nybegynder
03. marts 2003 - 19:34 #28
Jamen jeg takker da. Som sagt kører gc() processen med meget lav prioritet, så i CPU intensive programmer skal man kalde den manuelt (ex. i løkker).

JP
Avatar billede donnib Praktikant
03. marts 2003 - 23:39 #29
ø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.
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