7
votes

Grand tableau C # OutofMemoryException

Pour mon exercice de programmation en C #, j'essaie de créer un tableau de long, Avec une longueur de 0x1FFFFFFF (536 870 911 en base10), mais j'ai obtenu System.outofMemoryException.

Pour la construction, j'ai ciblé le système X64, et j'exécute VisualStudio2008 sur Windows7 X64 avec 8 Go de RAM. Il devrait être suffisant de mémoire pour le tableau (cela fonctionne sur le projet JDK X64 et CPP) P>

Toute pensée? P>

        const long MAX = 0x1fffffff; // 536870911 in base10
        program.arr = new long[MAX];
        for (long i = 0; i < MAX; i++)
        {
            program.arr[i] = i;                
        }


2 commentaires

FYI, ça s'appelle "C #", pas "Csharp".


Vous ne pouvez pas faire un objet aussi grand. Mais même si vous pouviez, vous semblez également souffrir de la malentendance que RAM détermine la quantité de mémoire que vous pouvez allouer. Ce n'est pas et n'a pas depuis des décennies. Quantité de RAM limite comment rapide vous pourrez accéder à cette mémoire. Avoir une grosse bélière est une optimisation de la performance; Les allocations de mémoire sont en réalité la meilleure pensée comme des allocations hors du fichier de page. N'oubliez pas que lorsque vous allouez la mémoire, vous allociez Mémoire virtuelle , pas Mémoire matérielle .


3 Réponses :


27
votes

Le CLR ne prend pas en charge aucun objet unique de taille supérieure à environ 2 Go. Vous demandez une matrimonie de 4 294 967 288 octets - plus de deux fois ce qui est soutenu.

Vous pouvez utiliser cette mémoire, mais pas dans un seul objet (tel qu'un tableau).


0 commentaires

5
votes

Il est difficile de recommander une alternative significative car vous n'êtes pas indiquant ce que vous essayez d'atteindre, ce que vous ne pouvez pas faire.

Cela dit si vous avez vraiment besoin de quelque chose qui est une vue contiguë rapide dans un espace d'adressage plat plus grand que 2 Go de taille que vous pouvez utiliser MemoryPapsfile .

Cela aiderait si vous avez indiqué ce que est censé aller dans ce morceau de mémoire, pourquoi l'espace d'adressage lui-même doit être contigu (vous transmettez-vous un pointeur au code non géré par exemple) et pourquoi il a besoin d'adressage plat.


0 commentaires

0
votes

Faire un sous-ensemble de matrice puis remplissez le tableau

Variy []

Masterarray [] <------ Remplissez votreparay [] jusqu'à 2 Go de tampon, puis ajoutez-le dans le masterarray


0 commentaires