[ milnen @ 01.06.2008. 13:28 ] @
Imam problem u Delphiju.
Promenljiva Buf je deklarisana kao Array of DWord;
Kada probam SetLength(Buf,8*2400*2000) dobijem poruku Out of memory. Racunar ima 2GB memorije i u tom trenutku ima vise od GB slobodne memorije. Ovaj niz zauzima nesto manje od 150 MB.
O cemu se radi?
[ savkic @ 01.06.2008. 15:45 ] @
> Promenljiva Buf je deklarisana kao Array of DWord;
> Kada probam SetLength(Buf,8*2400*2000) dobijem poruku Out of memory.
> Racunar ima 2GB memorije i u tom trenutku ima vise od GB slobodne memorije.

Meni prolazi u D7, i kada je deo steka (lokalna promenljiva) ili heapa (globalna). Kakva je situacija sa potrošnjom memorije u programu tada, možda nešto drugo okupira memoriju?
[ milnen @ 01.06.2008. 17:17 ] @
I ja koristim D7. Imam jos gomilu drugih nizova. Probao sam da prvo rezervisem memoriju za ovaj veliki, a posle i za sve ostale. Tako je proslo. Zasto? Ne znam.
[ morlic @ 01.06.2008. 20:47 ] @
Problem je fragmentacija memorije. Windows memory manager dodeljuje programima (i samom sistemu) trazene kolicine memorije, koju ti programi (u toku rada ili kada zavrse sa radom) vracaju sistemu, i tako u krug, sve bez nekog reda, pa vremenom dolazi do fragmentacije memorije, slicno kao kod hard diskova. To znaci da windows ima desetine, stotine, hiljade slobodnih blokova memorije, ali ako program trazi jedan veliki kontinualni niz slobodne memorije, Windows nije u stanju da to i omoguci pa dolazi do greske na koju se zalis. Takav problem imaju i poznatiji programi, npr.:

http://www.mathworks.com/support/solutions/data/1-1HE4G5.html

Moze se desiti da na tvojoj masini gde imas 2GB RAM memorije i ne bude neki problem da uzmes blokove od po 150MB, ali bih svakako izbegao pretpostavku da ces to moci i svakoj drugoj masini. Znaci ovde nije samo od uticaja ukupna fizicka kolicina memorije, vec i prethodno koriscenje memorije od strane samog windows-a i drugih programa na sistemu (u toku jedne sesije windows-a). Ako se racunar ne gasi duze vreme (server?) onda je stvar jos gora.

Ako je moguce promeni nacin na koji se memorija koristi tako sto ces koristiti manje blokove memorije, naravno ako je moguce, a da se performanse ne naruse. Bolji je i sporiji program koji sigurno radi, nego brz program "koji povremeno" ne radi, ili su zahtevi za njegovo izvrsavanje tesko ispunjivi u svakom trenutku.

Evo jos nekih linkova, pogledaj windows low-fragmentation heap, pogledaj kako radi windows memory manager:

http://msdn.microsoft.com/en-us/library/aa366779.aspx
http://support.microsoft.com/kb/894472
http://download.microsoft.com/...-9fde-d599bac8184a/MemMgt.docx

[ milnen @ 01.06.2008. 21:39 ] @
Hvala za ove informacije. Nisam razmisljao o tome na ovaj nacin. Mislio sam da se memorija dodeljuje bez obzira na kontinualnost, kao sto to radi hard disk.
Inace radilo se o upisu na hard disk, pa sam hteo da u cugu upisem sto vise sa BlockWrite.
[ savkic @ 01.06.2008. 23:59 ] @
> Inace radilo se o upisu na hard disk, pa sam hteo da u cugu upisem sto vise sa BlockWrite.

Mapiraj fajl u memoriju (memory mapped files) i onda će se promena u memoriji preslikati i na disk?