2010-09-11 6 views
2

J'espère que quelqu'un peut m'aider, j'essaie de créer un tableau int [400000000] (400 millions) sur mon application en utilisant Visual C++ 2010 mais il génère une erreur de débordement Le même code fonctionne sous linux avec g ++. J'ai besoin de cela parce que je travaille avec de grandes matrices. Merci d'avance.Très grand tableau sur le tas (Visual C++)

+0

vous essayez de créer dynamiquement? – cripox

+1

Peut-être que si vous partagez le problème de base que vous essayez de résoudre, nous serons en mesure d'être plus utile. –

+1

Sur certains systèmes, la taille de la structure de la pile est limitée. Vous pourriez courir dans ceci. Utilisez std :: vector <> pour voir si cela résout le problème (sinon vous manquerez de mémoire.) –

Répondre

1

Je ne sais pas si dans votre cas, il ne serait même pas préférable d'utiliser STXXL.

14

Si vous utilisez une application 32 bits, vous disposez par défaut de seulement 2 Go d'espace d'adressage utilisateur. 400 millions d'entiers est d'environ 1,5 Go. Il est très probable que vous n'ayez pas autant d'espace d'adressage contigu. Il est possible de forcer des fenêtres de 32 bits à allouer un espace d'adressage d'utilisateur de 3 Go pour chaque processus, mais cela peut être juste un intervalle d'arrêt pour votre situation.

Si vous pouvez passer à une architecture 64 bits, cela ne devrait pas poser de problème; Sinon, vous devriez trouver un moyen de stocker vos données matricielles d'une manière qui ne nécessite pas un seul bloc de stockage contigu, par exemple en le stockant en morceaux.

+1

+1, ou plus ... 650 Mo est à peu près tout ce que vous pouvez vous attendre.Stockage d'une matrice dans une structure de données plus intelligente est aussi très important pour la vitesse –

+1

Pour la vitesse, cela dépend de vos schémas d'accès.Pour un passage linéaire direct à travers les données, la différence entre le système d'exploitation paging sur les anciennes pages et une stratégie de mise en cache manuelle peut être rien.Si (par exemple!) vous effectuez une multiplication matricielle sur 20000 x 20000 matrices difficile de trouver une stratégie rapide, car vous devez combiner des nombres de toutes les zones des matrices dans toutes les combinaisons –

+0

@Charles: Pas * que * difficile, il suffit d'utiliser le blocage :) – jalf

0

Est-ce que le tableau entier doit vraiment être alloué? utilisez-vous vraiment tout le tableau? Est-ce un tableau avec beaucoup de 0? si c'est le cas, le fait que cela fonctionne mieux sur Linux peut être expliqué.

Dans ce cas, l'utilisation d'une matrice fragmentée pourrait être plus appropriée. L'utilisation d'une implémentation de baie clairsemée réduirait l'empreinte de la mémoire et permettrait peut-être un calcul plus rapide.

3

Je pense que vous avez besoin d'un algorithme Divide-and-Conquer. Pas d'espace mémoire.

+0

Ce n'est pas utile – eddyq

1

Peut-être sparse matrices sont utiles dans votre application. Ce concept est utilisé lorsqu'il s'agit de grandes matrices qui ont beaucoup de 0 entrées, ce qui peut être le cas dans un grand nombre d'applications.

Et en passant, vous ne gagnez rien en stockant une telle quantité de données sur le tas. Considérez que votre cache de processeur a peut-être 12 Mo! Au moins utiliser un mécanisme d'allocation de mémoire dynamique intelligent.

0

Je viens de trouver une solution très simple mais je ne sais pas s'il est conseillé

int tab[400000000]={0};//global array 

int main(array<System::String ^> ^args) 
{ 
std::cout<<tab[399999999]<<std::endl;//ok 

/* 
int* tab=new int[400000000];//doesn't work 
... 
delete[] tab; 
*/ 
    return 0; 
} 
+0

Votre solution ici est saisir l'espace d'adressage très tôt. Ne comptez pas sur ce travail pour un si grand bloc sur 32bits, il sera fragile pour l'environnement. – morechilli

Questions connexes