2009-10-30 9 views
0

problème court:Grand tableau dynamique en C++

#include <iostream> 

using namespace std; 

int main() 
{ 
    double **T; 
    long int L_size; 
    long int R_size = 100000; 
    long int i,j; 

    cout << "enter L_size:"; 
    cin >> L_size; 
    cin.clear(); 
    cin.ignore(100,'\n'); 
    cout << L_size*R_size << endl; 
    cout << sizeof(double)*L_size*R_size << endl; 

    T = new double *[L_size]; 
    for (i=0;i<L_size;i++) 
    { 
     T[i] = new double[R_size]; 
    } 

    cout << "press enter to fill array" << endl; 
    getchar(); 
    for (i=0;i<L_size;i++) 
    { 
     for (j=0;j<R_size;j++) 
     { 
      T[i][j] = 10.0; 
     } 
    } 
    cout << "allocated" << endl; 


    for (i=0;i<L_size;i++) 
    { 
     delete[] T[i]; 
    } 
    delete [] T; 
    cout << "press enter to close" << endl; 
    getchar(); 
    return 0; 
} 

avec 2 Go de RAM (sur OS 32 bits) Je ne peux pas le faire fonctionner avec L_size = 3000 ce qui est assez évidente car il faudrait environ. 2,4 Go.

Mais quand je commence 2 copies du programme ci-dessus chacun avec L_size = 1500 cela fonctionne - vraiment lent mais finalement à la fois renvoie allocated dans la console. Donc la question est - comment est-ce possible? Est-ce lié à la mémoire virtuelle?

Il est possible d'avoir un grand tableau stocké dans la mémoire virtuelle tout en opérant sur un autre - dans un programme?

Thx.

+0

Je m'attendrais à ce qu'il soit très lié à la capacité du système d'exploitation à échanger la mémoire inactive (c'est-à-dire une application suspendue (dans les termes préemptifs multi-tâches) et à en échanger une autre. – Lazarus

+0

Est-ce sur un système d'exploitation 32 bits ou sur un système d'exploitation 64 bits? – sbi

+0

En note, vous n'allouez pas "un grand tableau", mais L_size + 1 R_size arrays. Vous vous heurtez probablement à la limitation de mémoire adressable pour le système d'exploitation 32 bits. – mch

Répondre

7

Oui. Le système d'exploitation vous permettra d'allouer jusqu'à 2 Go de RAM par processus. Lorsque vous démarrez deux copies, il va laisser cette croissance en utilisant la mémoire virtuelle, ce qui sera très, très lent (car il utilise le disque dur), mais toujours fonctionner.

+0

Il est possible d'avoir un grand tableau stocké dans la mémoire virtuelle tout en opérant sur un autre - dans un programme? – Moomin

+0

Un programme 32 bits est limité dans la quantité de mémoire totale qu'il peut utiliser, car les pointeurs n'ont pas assez de bits pour tout adresser. C'est pourquoi 64 bits est de plus en plus populaire. –

+1

Oui. Sur un système 64 bits, votre premier cas de test ~ aurait pu fonctionner (si vous avez assez de spécifications de swap) - mais ce serait très lent. Il est techniquement possible d'allouer> 2 Go, même dans un programme Windows 32 bits, mais un peu plus difficile. (Cherchez le commutateur/3GB pour plus de détails, si vous êtes curieux.) –

1

Oui, c'est de la mémoire virtuelle. Avec L_size = 1500, vous pouvez démarrer la première instance et elle sera capable d'allouer la mémoire requise. Lorsque vous démarrez la deuxième instance, la mémoire allouée par la première instance est renvoyée vers le disque, ce qui libère de la place dans la RAM pour la deuxième instance. La quantité de RAM que vous pouvez allouer à tout moment et dans n'importe quel processus dépend non seulement de la quantité de RAM physique et de mémoire virtuelle (taille de fichier de page) dont vous disposez, mais également de la largeur de vos adresses de mémoire. . Sur une machine 64 bits, vous pourrez allouer beaucoup plus de mémoire en un seul processus que vous ne le feriez sur une machine 32 bits.