Je veux créer un tableau capable de stocker 10 ^ 9 numéros (long Int). Si j'essaie de faire cela mon compilateur se bloque. Ce qui est le réseau de taille maximum autorisé en C ++. Également si je le fais de manière dynamique aussi je Obtenez le même problème.Comment-je accomplir la tâche que je cherche à atteindre? Merci, toute aide serait appréciée. P>
4 Réponses :
Je ne pense pas que ce soit votre crash de compilateur, c'est votre crash de mémoire (hors de mémoire ou quelque chose du genre), par exemple sous Windows 32 bit, au plus, vous pouvez utiliser 2 ^ 32 bits d'espace mémoire inférieur à 10 ^ 9 * 64 Donc, vous obtiendrez une exception de mémoire. Vous pouvez l'utiliser par pagination et chargement de pièces plus petites du fichier à la mémoire. P>
EDIT: strong> comme TOBIAS LANGNER mentionné dans les commentaires, le compilateur pourrait également soulever cette erreur mais le problème d'origine est de la mémoire. P>
Si la matrice est allouée sur la pile, même le compilateur peut s'écraser (en fonction de ce qu'il fait là). Mais vous avez raison, c'est la mémoire à coup sûr (d'une manière ou d'une autre).
@Tobiaslangner, note intéressante, je m'en fous, merci.
Un tableau de 10 ^ 9 longs prend généralement au moins 4 Go de mémoire, ce qui serait déjà prohibitif dans tous les systèmes 32 bits.
Même si beaucoup de mémoire est disponible dans un système 64 bits que vous avez certainement Impossible d'allouer 4 Go sur la pile comme ceci: p>
Pourriez-vous expliquer la réponse un peu plus? Comment est la taille de la pile généralement peu de mbs?
@ffttyy n'est pas sûr de ce qui peut être expliqué là-bas. La taille de la pile du fil principal d'un processus est décidée par le chargeur exécutable du système d'exploitation, ce qui prend à son tour des suggestions de valeurs trouvées à l'intérieur de l'exécutable, ce qui signifie qu'il est indirectement décidé par les outils de construction (compilateur / lieur) utilisé pour créer ce. Pour des fils supplémentaires, l'appel de noyau qui les crée fournit également un moyen de spécifier la taille de la pile pour le nouveau fil. Dans tous les cas de tels cas, les OSE de bureau traditionnels et des outils de construction par défaut de quelque chose dans la gamme basse mégaoctets.
La taille maximale de la matrice dépend des données que vous stockez (et les entiers disponibles pour les indexer). P>
Donc, sur un système 32 bits, vous ne pouvez indexer que 2³² éléments au plus si vous êtes chanceux, ce qui est un peu supérieur à 10⁹. Sur un système 64 bits, vous pouvez indexer 2⁶⁴ éléments, ce qui est un peu supérieur à 10¹⁹. C'est essentiellement la taille maximale de la matrice. Être capable d'indexer qui n'implique pas que vous pouvez également obtenir cela autant du système d'exploitation, car l'espace d'adressage virtuel réel pourrait être beaucoup plus petit. Sur Linux, un espace d'adressement virtuel d'env. 64 téraoctets sont disponibles par processus sur 64 bits, qui sont 2⁴² octets. P>
Toutefois, si vous essayez réellement de l'allouer, vous avez besoin de beaucoup d'octets! Donc, si vous essayez d'allouer un tableau de sur un système 32 bits, c'est impossible. Sur un système de 64 bits, vous devez avoir cette quantité de RAM et de l'espace d'échange pour travailler. P>
Si vous êtes sur un système 32 bits ou sur un système 64 bits sans suffisamment de mémoire, vous obtiendrez une erreur de mémoire de mémoire, ce qui est probablement la raison du comportement que vous voyez. P>
Si vous essayez également de créer le tableau de manière statique dans une section .Data de votre exécutable, l'exécutable peut se retrouver avec 8 gbytes grand, où vous pourriez rencontrer des limites de système de fichiers (Toute personne FAT32?). De plus, le compilateur s'étoure probablement sur la quantité de données (sur 32 bits, il s'agira probablement). P>
Si vous allociez sur la pile (ceci est, en tant que tableau de variable local de taille statique), vous passerez également à des limites de pile sur certains systèmes d'exploitation. P> long int code> qui sera probablement 64bits de taille, vous avez besoin de 8 gigaoctets de mémoire. P>
Les systèmes de 64 bits actuels implémentent un espace d'adressage virtuel de 48 bits. Il ne serait donc pas possible de soutenir 2 ^ 64-1 éléments.
IIRC, il y a aussi le problème de ne pas trouver une zone de mémoire contiguë pouvant être attribuée à la matrice.
Je ne sais pas pourquoi vous dites 2³²-1? Comment trouver ce -1 code>, l'espace d'adressage est de 32 bits pour 2³². De plus, trop d'espace seront utilisés par le système d'exploitation et d'autres programmes.
@NHAHTDH: Lorsque vous obtenez la mémoire du système d'exploitation, cela peut-être mitité en cartographiant différentes zones de mémoire physique à un bloc contiguble.
@Wisagan, Saeedamiri: Vous avez les deux raison, je vais corriger mon post.
@Jonaswielicki: Je parle au niveau de la mémoire virtuelle. Même si c'est virtuel, il est encore partitionné dans différentes régions. Je pense qu'il est peut-être possible que la partition empêche une grande quantité de mémoire contiguë.
@nhahtdh Il s'agit d'un problème du gestionnaire de mémoire C dans ce cas et bien sûr un risque. Toutefois, si vous faites l'allocation de bloc suffisamment tôt dans le programme (c'est-à-dire avant que toute fragmentation de mémoire ne se produise) et MALLOC code> obtient sa mémoire à partir du système d'exploitation directement, il devrait fonctionner. Regarder ma consommation de mémoire Il semble que
MALLOC CODE> à un niveau (noyau ou utilisateurpace) est déjà alloué par blocs, il fonctionne toujours (essayé avec 4GBYtes).
@Jonaswielicki: Merci pour la réponse. Je comprends que ce n'est pas celui d'un problème au début du programme. Je veux juste confirmer que c'est également un cas possible que l'allocation peut échouer pour la demande de grande partie de la mémoire.
Je veux créer un tableau p> blockQuote>
Avez-vous vraiment besoin d'un tableau? En d'autres termes, avez-vous besoin que vos entiers soient dans un bloc de mémoire, ou si vous souhaitez simplement y accéder par index? Si vous ne vous souciez pas de la mise en page de la mémoire, mais que vous souhaitez toujours avoir un accès rapide aux éléments, vous devez utiliser
std :: deque code>. Au lieu d'attribuer une partie de la mémoire, cela stockera vos chiffres dans de nombreux petits morceaux, de sorte que vous avez suffisamment de mémoire pour stocker tous vos numéros ensemble, vous irez bien. P>
Qu'avez-vous essayé? (Montrez-nous le code) et plus important encore: avez-vous même beaucoup de mémoire?
Vous essayez d'allouer 4 Go (ou 8 Go sur un système) de la mémoire. Avez-vous même besoin de cela?
10 ^ 9
Long Ints Code> est d'environ 4 Go de mémoire ... Vous devez donc avoir 1) un système 64 bits pour pouvoir faire cela et 2) suffisamment de mémoire virtuelle + physique pour contenir ces données.
Quelle est la taille d'un
long int code> supposé être? 32 ou 64 bits? Quelle sorte de machine utilisez-vous, quelle quantité de RAM a-t-elle et à quelle vitesse avez-vous besoin du programme?
Quels sont i> les chiffres que vous essayez de stocker?
Prendre du recul. Qu'est-ce que est i> la tâche? Vous dites que vous voulez stocker 10 ^ 9 numéros, mais cela fait partie d'une implémentation d'une solution au problème réel. Que voulez-vous réaliser en stockant tous ces chiffres?
Allouer de manière dynamique la mémoire et l'utiliser comme une matrice, puis libérez-la lorsqu'il est utilisé.
Quelqu'un n'a-t-il pas de réponse comment le faire sur une machine 64 bits?
@nhahtdh Pourquoi vous souciez-vous s'il en a besoin ou non? S'il le demande, il le fait probablement.