Precedente :: Successivo |
Autore |
Messaggio |
ZapoTeX Dio maturo
Registrato: 04/06/04 16:18 Messaggi: 2627 Residenza: Universo conosciuto
|
Inviato: 11 Feb 2011 12:19 Oggetto: Allocazione statica e dinamica in C - help! |
|
|
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 |
|
|
freemind Supervisor sezione Programmazione
Registrato: 04/04/07 20:28 Messaggi: 4643 Residenza: Internet
|
Inviato: 11 Feb 2011 13:56 Oggetto: |
|
|
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 |
|
|
ZapoTeX Dio maturo
Registrato: 04/06/04 16:18 Messaggi: 2627 Residenza: Universo conosciuto
|
Inviato: 11 Feb 2011 14:03 Oggetto: |
|
|
Sono serie storiche di dati, ogni 10 secondi per 10 anni...
Forse è un po' tantino...
Ciao e grazie! |
|
Top |
|
|
SverX Supervisor Macchinisti
Registrato: 25/03/02 11:16 Messaggi: 11568 Residenza: Tokelau
|
Inviato: 11 Feb 2011 15:12 Oggetto: |
|
|
un array di 40 milioni di elementi... beh, era un po' che non ne vedevo
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 |
|
|
freemind Supervisor sezione Programmazione
Registrato: 04/04/07 20:28 Messaggi: 4643 Residenza: Internet
|
Inviato: 11 Feb 2011 15:49 Oggetto: |
|
|
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 |
|
|
ZapoTeX Dio maturo
Registrato: 04/06/04 16:18 Messaggi: 2627 Residenza: Universo conosciuto
|
Inviato: 11 Feb 2011 18:46 Oggetto: |
|
|
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!
Non capisco perché il heap sia più veloce dello stack anche quando sono grossi uguale. Ma mi va bene così!
Grazie ancora! |
|
Top |
|
|
freemind Supervisor sezione Programmazione
Registrato: 04/04/07 20:28 Messaggi: 4643 Residenza: Internet
|
Inviato: 11 Feb 2011 21:10 Oggetto: |
|
|
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 |
|
|
SverX Supervisor Macchinisti
Registrato: 25/03/02 11:16 Messaggi: 11568 Residenza: Tokelau
|
Inviato: 14 Feb 2011 11:03 Oggetto: |
|
|
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... |
|
Top |
|
|
SverX Supervisor Macchinisti
Registrato: 25/03/02 11:16 Messaggi: 11568 Residenza: Tokelau
|
Inviato: 14 Feb 2011 11:04 Oggetto: |
|
|
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...
|
|
Top |
|
|
ZapoTeX Dio maturo
Registrato: 04/06/04 16:18 Messaggi: 2627 Residenza: Universo conosciuto
|
Inviato: 15 Feb 2011 17:49 Oggetto: |
|
|
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 |
|
|
freemind Supervisor sezione Programmazione
Registrato: 04/04/07 20:28 Messaggi: 4643 Residenza: Internet
|
Inviato: 16 Feb 2011 00:29 Oggetto: |
|
|
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 |
|
|
SverX Supervisor Macchinisti
Registrato: 25/03/02 11:16 Messaggi: 11568 Residenza: Tokelau
|
Inviato: 16 Feb 2011 11:06 Oggetto: |
|
|
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...
|
|
Top |
|
|
freemind Supervisor sezione Programmazione
Registrato: 04/04/07 20:28 Messaggi: 4643 Residenza: Internet
|
Inviato: 16 Feb 2011 11:55 Oggetto: |
|
|
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...
|
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 |
|
|
ZapoTeX Dio maturo
Registrato: 04/06/04 16:18 Messaggi: 2627 Residenza: Universo conosciuto
|
Inviato: 20 Feb 2011 18:09 Oggetto: |
|
|
Sempre istruttivo leggervi!
Grazie! |
|
Top |
|
|
|