|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Feb 2003
Città: Milano
Messaggi: 7013
|
[c] come allocare un vettore o una matrice di grandi dimensioni?
Ciao a tutti,
ho un problema con l'allocazione di una matrice a 4 dimensioni che mi serve per contenere informazioni rilevanti in campo bioinformatico. La prima versione "ridotta" del programma che sto sviluppando opera su una matrice iniziale di dimensioni 100x1000. La matrice a 4 dimensioni che deve derivarne deve essere di dimensione 100x100x100x27. Se provo ad allocarla dinamicamente, mi viene restituito un errore di "stack overflow". Se, invece, provo ad allocarla con la malloc, son costretto poi a scorrerla in modo "ordinato" visto che devo implementare una lista. Ne deriva che, così facendo, non potrei effettuare un accesso puntuale al dato. Cosa mi consigliate di fare? Avevo anche pensato di creare un file e scrivere in modo ordinato gli elementi per poi leggerli o modificarli specificando degli offset. Che ne pensate? Staticamente, ovviamente, non esiste un modo per allocare una matrice di queste dimensioni, no? Grazie anticipatamente Alberto
__________________
Presidente comitato mondiale Anti-Troll La gloria la si deve acquistare, l'onore invece basta non perderlo. (Schopenhauer) |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
Quote:
comunque hai provato a modificare la dimensione dello stack con le syscall? Io stò dando per scontato che sei su linux.... |
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
probabilmente è troppo grande per lo stack, ma non ho capito il problema della matrice allocata nello heap
come stai allocando la matrice dinamicamente? |
|
|
|
|
|
#4 | |||||
|
Senior Member
Iscritto dal: Feb 2003
Città: Milano
Messaggi: 7013
|
Quote:
Comunque se dichiaro in maniera statica la matrice con: Quote:
Quote:
Se invece effettuo una dichiarazione di questo tipo: Quote:
Quote:
Chiedo lumi Grazie mille P.S. non saprei come accrescere la dimensione dello stack...in teoria una matrice di circa 27.000.000 di interi non dovrebbe avere una dimensione spropositata e invece a runtime mi occupa circa 2.2GB
__________________
Presidente comitato mondiale Anti-Troll La gloria la si deve acquistare, l'onore invece basta non perderlo. (Schopenhauer) Ultima modifica di swarzy85 : 26-07-2010 alle 16:15. |
|||||
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Jan 2005
Città: Torino
Messaggi: 144
|
Hai provato l'allocazione dinamica del vettore?
Codice:
int * matrice = malloc(sizeof(int) * NVALORI); Ovviamente "matrice" non dovrebbe essere un int * ma un int **** (almeno così mi sembra). |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Feb 2003
Città: Milano
Messaggi: 7013
|
Ma la matrice così comunque la alloca...il problema è che poi non potrei accedere in maniera puntuale ai singoli campi, no?
Sbaglio qualcosa nelle mie considerazioni?
__________________
Presidente comitato mondiale Anti-Troll La gloria la si deve acquistare, l'onore invece basta non perderlo. (Schopenhauer) |
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Jan 2005
Città: Torino
Messaggi: 144
|
Se tu la allochi nel modo che ti ho consigliato io (hai bisogno di 3 cicli for), l'accesso è puntuale, in quanto puntatori e vettori in C sono "intercambiabili".
Il tuo metodo della lista invece non permette l'accesso puntuale. |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
Quote:
devi usare un void**** ad esempio: Codice:
int ****matrix = malloc(sizeof(int***) * 100);
int i;
for (i = 0; i < 100; i++) {
int j;
matrix[i] = malloc(sizeof(int**) * 100);
for (j = 0; j < 100; j++) {
int k;
matrix[i][j] = malloc(sizeof(int*) * 100);
for (k = 0; k < 100; k++)
matrix[i][j][k] = malloc(sizeof(int) * 27);
}
}
|
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Nov 2004
Messaggi: 326
|
Se al posto di una lista ti allochi una matrice inoltre ti risparmi esattamente la metà dello spazio in memoria, visto che non hai bisogno di un puntatore per ogni elemento.
__________________
The problem with Troubleshooting is that often trouble shoots back... |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Feb 2007
Città: Verona
Messaggi: 1060
|
Lascia stare le liste.
Attento che stai dichiarando la tua "matrice" all'interno di un metodo e di conseguenza essa viene temporaneamente allocata sullo stack (BRUTTA cosa). Se la matrice deve avere visibilità globale, sposta la sua dichiarazione fuori dal metodo. In quel modo avrai uno spazio di memoria allocato staticamente all'avvio dell'eseguibile.
__________________
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Se la matrice ha dimensione prefissata io cercherei una soluzione un po' più bruta, ma funzionale:
int * matrix = (int *)malloc(N_PROBES * N_PROBES * N_PROBES * QUARTA_DIM * sizeof(int)); Poi provvederei a mettere a disposizione una macro per l'accesso alla matrice: #define matrix_elem(a, b, c, d) (matrix[a*N_PROBES + b*N_PROBES + c*N_PROBS + d]) In alternativa potresti usare un setter ed un getter con un bound check: Codice:
inline int get_elem(matrix m, int a, int b, int c, int d)
{
#ifdef _DEBUG
check_bound(a,b,c,d);
#endif
return matrix[a*N_PROBES + b*N_PROBES + c*N_PROBS + d];
}
inline int set_elem(matrix m, int a, int b, int c, int d, int value)
{
#ifdef _DEBUG
check_bound(a,b,c,d);
#endif
matrix[a*N_PROBES + b*N_PROBES + c*N_PROBS + d] = value;
}
Il controllo sugli indici volendo si potrebbe effettuare anche nella macro |
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Se la alloca dinamicamente è solo il puntatore che risiede nello stack. |
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Feb 2007
Città: Verona
Messaggi: 1060
|
Quote:
edit: ah, la tua soluzione non mi dispiacerebbe affatto
__________________
Ultima modifica di malocchio : 28-07-2010 alle 02:00. |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:33.




















