Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Allocazione memoria MALLOC
Forum - C/C++ - Allocazione memoria MALLOC

Avatar
lucapiatti (Normal User)
Newbie


Messaggi: 3
Iscritto: 25/10/2007

Segnala al moderatore
Postato alle 15:29
Venerdì, 09/05/2008
Buongiorno, questo è il mio primo post, ma avrei una richiesta particolare.
Ho un problema con un programma che gira sotto WinXp Sp2. Ho la necessità di gestire file di grosse dimensioni, con l'eventuale necessità di swappare su disco. L'allocazione avviene tramite
malloc.Dispongo di 3Gb di Ram sulla macchina, ma puntualmente arrivato alla soglia dei 2 Gb la malloc fallisce. Sembra che si siano dei problemi nello swap di Xp. Qualcuno mi sa sopperire a questo problema?

PM Quote
Avatar
gantonio (Normal User)
Guru^2


Messaggi: 1532
Iscritto: 09/09/2007

Segnala al moderatore
Postato alle 15:50
Venerdì, 09/05/2008
La questione e' un'altra.

Il modello di Win32 (e quindi anche XP) dedicano 2 G degli indirizzi di sistema alle applicazioni utente e 2 G al kernel.

Quindi, pur avendo piu' di 2 G di RAM NON POTRAI mai allocare piu' dei 2 G ...

In realta' allocare piu' di 2 G e' una situazione particolarmente rara (utilizzata, ad esempio, dai DBMS, Oracle o SQL Server ...). In quel caso, e' possibile utilizzare uno switch al boot per modificare il rapporto e portarlo a 3 G per l'utente e 1 G per il kernel ma non di piu'.

Mi sembra strano che tu non possa lavorare allocando meno memoria (forse stai sbagliando qualcosa nella "logica" della tua applicazione).

Il limite della memoria lo puoi superare con macchine x64.

PM Quote
Avatar
lucapiatti (Normal User)
Newbie


Messaggi: 3
Iscritto: 25/10/2007

Segnala al moderatore
Postato alle 15:57
Venerdì, 09/05/2008
In realtà i file che sto aprendo sono immagini ad alta risoluzione e di grosse dimensioni. Con sistemi operativi precedenti non ho mai avuto problemi di questo tipo, il SO swappava tranquillamente.

PM Quote
Avatar
gantonio (Normal User)
Guru^2


Messaggi: 1532
Iscritto: 09/09/2007

Segnala al moderatore
Postato alle 16:04
Venerdì, 09/05/2008
Non so a quale ti riferisci ma non puoi avere allocato - con una sola allocazione - piu' di 2 G ...

Nel caso di PIU' allocazioni (di dimensioni minori di 2 G singolarmente ma di dimensioni maggiori della massima memoria disponibile) allora interviene lo swap ...

Forse non mi sono spiegato prima ... con una SINGOLA allocazione NON esistono gli indirizzi assegnabili ad un singolo processo e quindi lo swap non servirebbe a nulla ...

PM Quote
Avatar
lucapiatti (Normal User)
Newbie


Messaggi: 3
Iscritto: 25/10/2007

Segnala al moderatore
Postato alle 16:14
Venerdì, 09/05/2008
Chiedo scusa, anche io mi sono spiegato male.
Allora, diciamo che ho in memoria 3 immagini. Quando vado ad aprire la quarta, che mi porterebbe oltre i 2Gb (nonostante i miei 4 fisici), la malloc fallisce.Con cp Sp1 piuttosto che W2000 piuttosto che Win98, non incontravo questo problema.

PM Quote
Avatar
gantonio (Normal User)
Guru^2


Messaggi: 1532
Iscritto: 09/09/2007

Segnala al moderatore
Postato alle 16:54
Venerdì, 09/05/2008
Prova ad usare la GlobalAlloc ...

Codice sorgente - presumibilmente C/C++

  1. HGLOBAL h = GlobalAlloc(GHND, 2000000000);
  2.   if(h!=NULL)
  3.   {
  4.     char *p = (char*)GlobalLock(h);
  5.     if(p!=NULL)
  6.     {
  7.       // usa memoria
  8.  
  9.  
  10.       // la memoria non serve piu'
  11.       GlobalUnlock(p);
  12.     }
  13.   GlobalFree(h);
  14.   }


PM Quote
Avatar
Cheru (Normal User)
Newbie


Messaggi: 1
Iscritto: 15/10/2008

Segnala al moderatore
Postato alle 16:23
Mercoledì, 15/10/2008
Scusate se mi intrometto nella discussione ma anche io ho lo stesso problema di gestione di immagini grosse e quindi di buffer grossi.

Io ho sempre usato la:
Handle=GlobalAlloc(GMEM_MOVEABLE,Dim);
In modo che il sistema operativo possa "spostare" a piacimento l'area di memoria allocata in caso di necessità.

Su una macchina Win2000 con 1.8 giga di Ram liberi (e anche su una che utilizza Xp) se cerco di allocare più di 600 mega di ram la funzione fallisce dicendo "memoria insufficente".

Ho provato anche con

Handle=GlobalAlloc(GHND,Dim);
ma arrivo al massimo a 600 mega.

Posso invece fare quanti buffer voglio di 300 mega fino a ad arrivare anche a 2.5 giga allocati.

Non penso che in 1.8 giga non ci sia un blocco contiguo di 1 giga. Anche perchè sui computer ustati per i test non ci sono altri programmi che girano (oltre l'antivisur ovviamente)

Non esiste per caso qualche cosa che dice al sistema operativo di bloccare le allocazioni al di sopra di un dato valore?

Ho già un programma molto complesso che gestisce immagini e purtroppo adesso è nata la necessità di gestire immagini sempre più grosse.

Ringrazio in anticipo per l'aiuto che potrete darmi

Ciao a tutti

Cherubino

PM Quote