PDA

Tam Sürümünü Görmek İçin : malloc kullanırken bellek bitiyorsa


yeminer
08/05/2007, 16:29
Arkadaşlar yazdığım programda resimleri diskten okuyup belleğe atıyorum, yaklaşık 150 resim var ama daha 25. resimde malloc bellek döndürmez oluyor. C kodunu .Net 2005 in derleyicisinde yazıyorum. Bu konuda nasıl bir çözüm önerirsiniz, kullandığım belleği genişletmek için ne yapmalıyım? Programının kullandığı bellek alanını nasıl arttırabilirim?


quasimodo
08/05/2007, 17:40
Sadece uzerinde islem yapacagin resimleri okusan daha sonra isinin
bittiklerini sisteme geri versen.

yeminer
08/05/2007, 18:02
Tüm resimler üzerinde aynı anda işlem yapıyorum. Bir yapay zeka uygulaması ve resimler arasındaki ilişkiye dayanıyor. Yani malesef birini açıp işimi halledip diğerini açayım gibi birşey yapma şansım yok. Ama yine de önerin için teşekkür ederim.

quasimodo
08/05/2007, 18:07
Yani belekte butun resimleri okuyacak yerin yoksa buna
kimse cozum bulamaz sanirim. Peki resimleri belirli bir bolgesi uzeride islem yapıyorsan sadece o bolgelerini okusan.:)

yeminer
08/05/2007, 18:18
Hayır efendim yanlış anladın, bellekte yer yok olur mu ? tanesi 3-5 KB lik 150 tane resim, belleğimin boyutu 1 GB. Yani yer var ancak malloc ile alamıyorum ve birşekilde almam gerek.

Bu malloc taki sorun sanırım programımın data segmentinin boyutu ile ilgili bir mesele ancak bu boyutu nasıl arttırabilrim, ya da arttırmadan belleğin başka bölümlerinde nasıl işlem yapabilirim onu öğrenmek istiyorum.

quasimodo
08/05/2007, 18:25
Yanlis anlamisim evet malloc() fonksiyonuyla 65535 byte lik yer ayirabiliriz.
Gerci bunun kullanilan bellek moduyla alakasi var ama nasil bir cozumu
var bilmiyorum.

yeminer
08/05/2007, 19:50
Bir şekilde bellek modu değiştirilebilir mi? Değiştirilemezse mutlaka daha büyük boyutta verilerle uğraşmak için fonksiyonlar vardır, onlara bakıyorum artık. Umarım yakın zamanda hallederim bu sorunu.

Euclides
08/05/2007, 21:12
malloc'un max'i 0xFFFF değil zaten sadece gidip dökümantasyona bakmanız yeterli.

"In Visual C++ 2005, malloc sets errno to ENOMEM if a memory allocation fails or if the amount of memory requested exceeds _HEAP_MAXREQ."

Bakıyoruz _HEAP_MAXREQ kaçmış ?

#ifdef _WIN64
#define _HEAP_MAXREQ 0xFFFFFFFFFFFFFFE0
#else
#define _HEAP_MAXREQ 0xFFFFFFE0
#endif

Not: tabii bu rakam biraz abartılı, teorik olarak bakmak gerekirse en fazla (0xFFFFFFFF - (kernel space size)) kadar alabilirsiniz

golgepapaz
08/05/2007, 21:31
Hayır efendim yanlış anladın, bellekte yer yok olur mu ? tanesi 3-5 KB lik 150 tane resim, belleğimin boyutu 1 GB. Yani yer var ancak malloc ile alamıyorum ve birşekilde almam gerek.

Bu malloc taki sorun sanırım programımın data segmentinin boyutu ile ilgili bir mesele ancak bu boyutu nasıl arttırabilrim, ya da arttırmadan belleğin başka bölümlerinde nasıl işlem yapabilirim onu öğrenmek istiyorum.

o resimler 3-5kb yerine, 3-5mb olmasin?

yeminer
09/05/2007, 10:29
Afedersiniz, 64K yanlış olmuş, sonradan farkettim. Ama resimler de 3-5 MB değil, tüm resimler 5 MB ediyormuş ama bunlarda 8 de birini bile almadan bellek tükeniyor. Euclides'in dediği yazıyı ben de okudum ama bir anlamı yok. Yani o rakamlara müdahale etsem de yine de alabileceğim bellek miktarı değişmiyor, sanırım bunun nedeni de yine onun belirttiği (0xFFFFFFFF - (kernel space size)). Ancak bana çok saçma geliyor bir programın en fazla 1-2 MB bellekle çalışabilmesi, çok daha fazlası ile çalışan programları kullanıyoruz. Bu tür programlar bellekten yer almak için hangi fonksiyonu kullanıyorlar?

golgepapaz
09/05/2007, 11:14
eger su ki malloc hafizada istedigin kadar surekli bir yer alamzsa da fail olur, hafizanin ne kadar buyuk oldugu onemli degil,eger hafizada bulunan butun nesnelerin herhangi ikisi arasinda istedigin buyuklukte,xurekli (continuous) hafiza yoksa yine memory alamazsin, vu durumda programinin pek cok kucuk malloc kullanmadigini (C yaziyorsan) veya hafiza spacenin kirletmedigine emin ol, gerci her durumda bir memoryde 64k yer bulamamak pek mumkun gozukmuyor.gercekten 64k memory istedigine eminmisin????

furkans
09/05/2007, 11:21
malloc la alakası yok ama c++ kullancaksan dinamik bir bellek olan linked list kullansan?

acehreli
09/05/2007, 20:52
furkans, std::list de arka planda malloc kullandigi icin yarari olmaz.

Ali