[Tech] Massima allocazione array

Franco Bagnoli franco.bagnoli@gmail.com
Mer 2 Set 2009 14:50:58 CEST


2009/9/2 Tommaso Biancalani - Llewlyn <tommaso.biancalani@gmail.com>:
> Ciao a tutti,
> su una ubuntu col gcc 4.3.3 sto cercando di scrivere un programmino che tra
> le tante belle cose deve allocare un bel pò di memoria per farci qualche
> conto, il problema è sui limiti di allocazione. Allocare staticamente un
>
> int vet[3000000]; // ~ 3*10^6
>
> è sufficiente a mandare in segmentation fault ogni cosa. Se lo alloco
> chiamando una malloc riesco a superare questa limitazione (xchè?), ad
> esempio:
>
> int *b;
> b = (int *)malloc(sizeof(int)*1000000000); // 10^9
>
> passa liscio come l'oro. Se vado un ordine di grandezza sopra però la malloc
> ritorna NULL e io ritorno triste. Da dove origina questa limite? È linux che
> riserva un tot massimo di memoria ad un'applicazione? Come lo inculo?
> A me garbava l'allocazione statica xchè permette una notazione comoda
> passando a vettori multidimensionali (vet[i][j][k]), allocando matrici di
> matrici con malloc suppongo debba inventarmi qualche macro e indicizzarmi a
> mano l'offset. Solitamente qual'è la strategia ottimale?

non so la risposta giusta, ma ricordo che l'allocazione statica (in
fortran) creava dei programmi di dimensione tale da contenere appunto
i vettori allocati, ovvero penso che l'allocazione statica implichi
che si debbano risolvere l'indirizzo delle variabili al momento della
compilazione, mentre quella dinamica ovviamente risolve gli indirizzi
al momento del run.

se vuoi usare una notazione tipo vet[i][j][k] basta allocare a mano i
vettori di vettori

int *** v;
...
v=malloc(Ni*sizeof(int**));
for (i=0; i<Ni; i++) {
  v[i] = malloc(Nj*sizeof(int**));
  for (j=0; j<Nj; i++) { {
    v[i]j[j] = malloc(Nk*sizeof(int**));
  }
}

con il vantaggio che non richiedi una zona contigua di memoria,
alternativamente ti definisci una macro.

Comunque la stragegia migliore dipende da come devi memorizzare questi
dati: sono sparsi (molti zeri) ocompatti? sono sequenziali? perché
puoi usare hash table, alberi, o memorizzare su disco (cosa che
comunque fai senza controllo se superi la memoria fisica..)


-- 
Franco Bagnoli <franco.bagnoli@unifi.it> <franco.bagnoli@gmail.com>
Lab. Fisica dei Sistemi Complessi, Dip. Energetica & CSDC
Universita' di Firenze, via S. Marta, 3 I-50139 Firenze, Italy.
Tel. +39 0554796592, fax: +39 0554796342



Maggiori informazioni sulla lista flug-tech