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++)
Répondre
Je ne sais pas si dans votre cas, il ne serait même pas préférable d'utiliser STXXL.
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, 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 –
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 –
@Charles: Pas * que * difficile, il suffit d'utiliser le blocage :) – jalf
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.
Je pense que vous avez besoin d'un algorithme Divide-and-Conquer. Pas d'espace mémoire.
Ce n'est pas utile – eddyq
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.
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;
}
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
- 1. très grand tableau de fichier en PHP
- 2. Très, très grand nombre dans vb.net
- 3. optimiser les opérations arithmétiques sur un très grand nombre
- 4. Grand tableau dynamique en C++
- 5. Récupérer le grand-tableau de tableau croisé?
- 6. C++ sift down tas
- 7. Quand dois-je affecter sur le tas? (C++)
- 8. propriété Tas de ce tableau
- 9. Comment commander facilement un tableau du plus grand au plus petit dans Visual C#?
- 10. Grand tableau dynamique - écriture lente
- 11. Passe grand tableau multidimensionnel pour fonctionner en C
- 12. Bonne idée/mauvaise idée: Utiliser le QSet de Qt sur un très grand ensemble de données?
- 13. Taille du tas Java: erreur lors du réglage trop grand
- 14. Puis-je passer le runtime Visual C++ à un autre tas?
- 15. tas de RSS sur le blog?
- 16. Je dois créer un très grand nombre de bits/valeurs booléennes. Comment ferais-je cela en C/C++?
- 17. procédure max_heapify sur tas
- 18. Visual Studio 2005 et Sitecore ... Très très lent
- 19. Débogage un grand tableau à double
- 20. Comment lancer un très grand nombre de processus dans bash
- 21. déclarant le plus grand tableau en utilisant size_t
- 22. Utilisation d'un grand tableau statique en C# (Silverlight sur Windows Phone 7)
- 23. Comment spécifier un caractère très grand dans UIButton?
- 24. Filtrer les fichiers dans un très grand dossier
- 25. Comment réduire le temps de liaison pour un grand projet écrit en langage Visual C++ natif?
- 26. MySql simple - Obtenir le plus grand nombre dans le tableau
- 27. Comment trouver le plus grand et le plus petit nombre dans un tableau en c
- 28. Visual C++ déclarant un tableau de chaînes
- 29. gdb: comment accélérer le débogage sur un très gros binaire?
- 30. Chargement très grand fichier RDF dans openrdf Gestionnaire d'ontologie sésame
vous essayez de créer dynamiquement? – cripox
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. –
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.) –