Indice del forum Olimpo Informatico
I Forum di Zeus News
Leggi la newsletter gratuita - Attiva il Menu compatto
 
 FAQFAQ   CercaCerca   Lista utentiLista utenti   GruppiGruppi   RegistratiRegistrati 
 ProfiloProfilo   Messaggi privatiMessaggi privati   Log inLog in 

    Newsletter RSS Facebook Twitter Contatti Ricerca
Allocazione statica e dinamica in C - help!
Nuovo argomento   Rispondi    Indice del forum -> Programmazione
Precedente :: Successivo  
Autore Messaggio
ZapoTeX
Dio maturo
Dio maturo


Registrato: 04/06/04 16:18
Messaggi: 2627
Residenza: Universo conosciuto

MessaggioInviato: 11 Feb 2011 12:19    Oggetto: Allocazione statica e dinamica in C - help! Rispondi citando

Carissimi superesperti di programmazione!


Vi chiedo aiuto perché devo lavorare con degli array che contengono ognuno circa 40,000,000 di elementi. Sono due array di float, due di int, cinque ancora di int ma che potrei ridefinire di byte, così occupano meno, tanto sono tutti compresi tra 1 e 60, due di float.


Facendo prove con un subset lungo 54,000 invece che 40 milioni, ho messo lo stack a 2.5 MB, usato allocazione statica e mi basta (quando era a 250 K non bastava).

Ma per farlo con i 40 milioni?

Che vantaggio avrei usando l'allocazione dinamica? Guadagno velocità? Potrei mettere lo stack a 1GB o ci sono controindicazioni?

Grazie a tutti in anticipo!

Davide
Top
Profilo Invia messaggio privato HomePage
freemind
Supervisor sezione Programmazione
Supervisor sezione Programmazione


Registrato: 04/04/07 20:28
Messaggi: 4643
Residenza: Internet

MessaggioInviato: 11 Feb 2011 13:56    Oggetto: Rispondi citando

Scusa, ma come mai hai degli array di 40 milioni di elementi?
Guarda che secondo me devi ridefinire il problema, forse è meglio pensare a delle liste non lineari, a dei grafi o roba del genere!
Top
Profilo Invia messaggio privato
ZapoTeX
Dio maturo
Dio maturo


Registrato: 04/06/04 16:18
Messaggi: 2627
Residenza: Universo conosciuto

MessaggioInviato: 11 Feb 2011 14:03    Oggetto: Rispondi citando

Sono serie storiche di dati, ogni 10 secondi per 10 anni...

Forse è un po' tantino...

Ciao e grazie!
Top
Profilo Invia messaggio privato HomePage
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 11:16
Messaggi: 11568
Residenza: Tokelau

MessaggioInviato: 11 Feb 2011 15:12    Oggetto: Rispondi citando

un array di 40 milioni di elementi... beh, era un po' che non ne vedevo Wink

parlando seriamente... non va di sicuro nello stack, eventualmente in heap (allocazione dinamica) se non ti va di allocarla in modo statico. La differenza in termini di performance non c'è, quindi direi vai assolutamente di allocazione dinamica.

ovviamente un array di 40 milioni di interi (a 32 bit) occupa 152,58 MB quindi se non hai sufficiente RAM (per ipotesi) allora preparati a rallentamenti dovuti allo swap.

l'unico problema che vedo è l'indice dell'array, dipende dal compilatore... sarà in grado di gestire array con indici a 32 bit?

altrimenti un bel database e fare query SQL? Che in generale per poter compiere operazioni non è necessario che tutti i dati vengano caricati in memoria tutti assieme...
Top
Profilo Invia messaggio privato HomePage
freemind
Supervisor sezione Programmazione
Supervisor sezione Programmazione


Registrato: 04/04/07 20:28
Messaggi: 4643
Residenza: Internet

MessaggioInviato: 11 Feb 2011 15:49    Oggetto: Rispondi citando

Ah vabbè, alla fine mica ho risposto alla tua domanda.
La vedo come SverX, memoria dinamica e via fermo restando con i dubbi di SverX e comunque se non hai una sorta di struttura indice per farci delle ricerche dentro avrai comunque prestazioni basse.
Top
Profilo Invia messaggio privato
ZapoTeX
Dio maturo
Dio maturo


Registrato: 04/06/04 16:18
Messaggi: 2627
Residenza: Universo conosciuto

MessaggioInviato: 11 Feb 2011 18:46    Oggetto: Rispondi citando

Grazie mille!

Allora, il riassunto è: "non ho capito come sia possibile, ma ora funziona di brutto".

Avevo provato a settare lo stack a un GB, ma andava lentissimo. Allora ho utlizzato l'allocazione dinamica, ma dinamica per finta, nel senso che uso calloc, ma alloco lo spazio necessario per tutto l'array già all'inizio del programma.

E questo velocizza l'esecuzione di decine o centinaia di volte! Smile Very Happy

Non capisco perché il heap sia più veloce dello stack anche quando sono grossi uguale. Ma mi va bene così!

Grazie ancora!
Top
Profilo Invia messaggio privato HomePage
freemind
Supervisor sezione Programmazione
Supervisor sezione Programmazione


Registrato: 04/04/07 20:28
Messaggi: 4643
Residenza: Internet

MessaggioInviato: 11 Feb 2011 21:10    Oggetto: Rispondi citando

Il sistema operativo normalmente ignora lo heap quindi questo non è soggetto a controlli di nessun tipo. Lo stack invece viene continuamente guardato dal sistema. Questo fa si che lavorare con lo heap porta a maggior velocità.
Ovviamente questo è vero se parliamo di codice managed (java, .net etc...).
Top
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 11:16
Messaggi: 11568
Residenza: Tokelau

MessaggioInviato: 14 Feb 2011 11:03    Oggetto: Rispondi citando

comunque lo stack è per le variabili locali, non voglio credere che tu avessi davvero bisogno di definire degli array di quella dimensione come variabili locali... Rolling Eyes
Top
Profilo Invia messaggio privato HomePage
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 11:16
Messaggi: 11568
Residenza: Tokelau

MessaggioInviato: 14 Feb 2011 11:04    Oggetto: Rispondi citando

ZapoTeX ha scritto:
Allora ho utlizzato l'allocazione dinamica, ma dinamica per finta, nel senso che uso calloc, ma alloco lo spazio necessario per tutto l'array già all'inizio del programma.


per la cronaca: si chiama dinamica perché viene allocata in 'run time', cioè al momento dell'esecuzione del programma, e non in 'compile time' cioè al momento della compilazione del programma. Quindi è dinamica, anche se la allochi una volta sola all'inizio del programma...

Ciao
Top
Profilo Invia messaggio privato HomePage
ZapoTeX
Dio maturo
Dio maturo


Registrato: 04/06/04 16:18
Messaggi: 2627
Residenza: Universo conosciuto

MessaggioInviato: 15 Feb 2011 17:49    Oggetto: Rispondi citando

Citazione:
array di quella dimensione come variabili locali... Rolling Eyes

Assolutamente no, sono il core del programma e servono in tutte le funzioni! Non la sapevo questa cosa dello stack... Cioè, se io definisco delle variabili staticamente ma come variabili globali, non vanno nello stack?

Citazione:
si chiama dinamica perché viene allocata in 'run time', cioè al momento dell'esecuzione del programma, e non in 'compile time' cioè al momento della compilazione del programma. Quindi è dinamica, anche se la allochi una volta sola all'inizio del programma...

OK! Tutto chiaro!

Grazie mille!
Top
Profilo Invia messaggio privato HomePage
freemind
Supervisor sezione Programmazione
Supervisor sezione Programmazione


Registrato: 04/04/07 20:28
Messaggi: 4643
Residenza: Internet

MessaggioInviato: 16 Feb 2011 00:29    Oggetto: Rispondi citando

ZapoTeX ha scritto:
Citazione:
array di quella dimensione come variabili locali... Rolling Eyes

Assolutamente no, sono il core del programma e servono in tutte le funzioni! Non la sapevo questa cosa dello stack... Cioè, se io definisco delle variabili staticamente ma come variabili globali, non vanno nello stack?

No Zopo, una var finisce nello stack se è creata staticamente, globale o no che sia.
Finisce nello heap se invece viene creata dinamicamente, globale o no che sia.

L'unico dubbio che ho è che alcuni compilatori potrebbero gestire in modo un po' diverso le var globali inizializzate esplicitamente rispetto a quelle inizializzate implicitamente però alla fine sempre nello stack finiscono.

bau
Top
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 11:16
Messaggi: 11568
Residenza: Tokelau

MessaggioInviato: 16 Feb 2011 11:06    Oggetto: Rispondi citando

freemind ha scritto:
una var finisce nello stack se è creata staticamente, globale o no che sia.
Finisce nello heap se invece viene creata dinamicamente, globale o no che sia.


Onestamente non so quale sia la tua fonte, ma ti assicuro che è sbagliata. Nello stack vengono allocate solo le variabili locali, le variabili globali sono allocate in un'area di memoria che non varia per tutta la durata dell'esecuzione del programma (e quindi un puntatore ad una di queste variabili sarà una costante, per intenderci).
Lo heap invece è dove viene allocata dinamicamente la memoria (intendo allocazioni con malloc(), calloc() etc etc) e questa allocazione è in un certo senso globale, cioè è accessibile a tutte le funzioni di un programma, a patto che conosca l'indirizzo.

Esempio:

Codice:
int i;

void funct(void) {
  int j;
  void *mem;

  mem=malloc();

}


i è una variabile globale, statica. Non è allocata né nello heap né nello stack.
j è una variabile locale. E' allocata nello stack. (*)
*mem è una variabile locale. E' allocata nello stack. (*)
la malloc() alloca uno spazio nello heap e ne associa l'indirizzo alla variabile locale mem.

va da sè che se la funzione funct() finisce senza deallocare la memoria allocata dalla malloc, questa si perde. Almeno nei linguaggi senza garbage collection, come il C.

(*) non è detto sia veramente allocata nello stack: il compilatore potrebbe decidere di non averne bisogno, non allocarla proprio e usare un registro della CPU. Ma questo esula dal nostro discorso...
Rolling Eyes
Top
Profilo Invia messaggio privato HomePage
freemind
Supervisor sezione Programmazione
Supervisor sezione Programmazione


Registrato: 04/04/07 20:28
Messaggi: 4643
Residenza: Internet

MessaggioInviato: 16 Feb 2011 11:55    Oggetto: Rispondi citando

SverX ha scritto:
freemind ha scritto:
una var finisce nello stack se è creata staticamente, globale o no che sia.
Finisce nello heap se invece viene creata dinamicamente, globale o no che sia.


Onestamente non so quale sia la tua fonte, ma ti assicuro che è sbagliata. Nello stack vengono allocate solo le variabili locali, le variabili globali sono allocate in un'area di memoria che non varia per tutta la durata dell'esecuzione del programma (e quindi un puntatore ad una di queste variabili sarà una costante, per intenderci).
Lo heap invece è dove viene allocata dinamicamente la memoria (intendo allocazioni con malloc(), calloc() etc etc) e questa allocazione è in un certo senso globale, cioè è accessibile a tutte le funzioni di un programma, a patto che conosca l'indirizzo.

Esempio:

Codice:
int i;

void funct(void) {
  int j;
  void *mem;

  mem=malloc();

}


i è una variabile globale, statica. Non è allocata né nello heap né nello stack.
j è una variabile locale. E' allocata nello stack. (*)
*mem è una variabile locale. E' allocata nello stack. (*)
la malloc() alloca uno spazio nello heap e ne associa l'indirizzo alla variabile locale mem.

va da sè che se la funzione funct() finisce senza deallocare la memoria allocata dalla malloc, questa si perde. Almeno nei linguaggi senza garbage collection, come il C.

(*) non è detto sia veramente allocata nello stack: il compilatore potrebbe decidere di non averne bisogno, non allocarla proprio e usare un registro della CPU. Ma questo esula dal nostro discorso...
Rolling Eyes

Scuate entrambi, ho messo insieme 2 frasi nella prima.
Le var globali sono gestite in modo un po' autonomo dai vari compilatori.
E' norma buttare in bss le var globali (che eventualmente saranno inizializzate con i valori di default ma dipende dal compilatore).

Lo stack serve alle var locali.
Scusate ma non ho riletto quello che avevo scritto e soprattutto ho scritto una cosa ma ne pensavo un'altra.
Top
Profilo Invia messaggio privato
ZapoTeX
Dio maturo
Dio maturo


Registrato: 04/06/04 16:18
Messaggi: 2627
Residenza: Universo conosciuto

MessaggioInviato: 20 Feb 2011 18:09    Oggetto: Rispondi

Sempre istruttivo leggervi!

Grazie!
Top
Profilo Invia messaggio privato HomePage
Mostra prima i messaggi di:   
Nuovo argomento   Rispondi    Indice del forum -> Programmazione Tutti i fusi orari sono GMT + 1 ora
Pagina 1 di 1

 
Vai a:  
Non puoi inserire nuovi argomenti
Non puoi rispondere a nessun argomento
Non puoi modificare i tuoi messaggi
Non puoi cancellare i tuoi messaggi
Non puoi votare nei sondaggi