web-dev-qa-db-fra.com

Quel est le nombre maximal d'éléments dans une liste <T>?

Quelqu'un sait quel est le nombre maximum d'éléments dans une liste? 

Comment puis-je augmenter cette taille? Ou existe-t-il une collection qui prend des objets infinis? (autant que cela puisse tenir dans la mémoire, c'est)

MODIFIER:

J'obtiens une exception de mémoire insuffisante lorsque Count = 134217728 dans une liste d'ints. obtenu 3Gb de RAM dont 2.2 sont en cours d'utilisation. Semble normal

31
Tony The Lion

List<T> sera limité au maximum d'un tableau, soit 2 Go (même en x64). Si cela ne suffit pas, vous utilisez le mauvais type de stockage de données. Vous pouvez toutefois économiser beaucoup de temps en démarrant à la bonne taille - en transmettant une variable int au constructeur.

Re votre édition - avec 134217728 x Int32, soit 512MB. Rappelez-vous que List<T> utilise un algorithme de doublage; Si vous distribuez des articles au goutte-à-goutte via Add (sans allouer tout l'espace au préalable), le système va essayer de doubler pour atteindre 1 Go (en plus des 512 Mo que vous possédez déjà, le reste de votre application et bien sûr le runtime CLR et les bibliothèques). Je suppose que vous êtes sur x86, vous avez donc déjà une limite de 2 Go par processus, et il est probable que vous ayez fragmenté votre "tas d'objet volumineux" en death lors de l'ajout d'éléments.

Personnellement, oui, il semble juste de commencer à avoir une mémoire insuffisante à ce stade.


Edit: dans .NET 4.5, les tableaux de plus de 2 Go sont autorisés si le commutateur <gcAllowVeryLargeObjects> est activé. La limite est alors de 2 ^ 31 éléments. Cela peut être utile pour les tableaux de références (8 octets chacun en x64) ou un tableau de grands structs.

56
Marc Gravell

Ce n'est limité que par la mémoire.

edit: ou pas, 2 Go est la limite! Ceci est assez intéressant, BigArray, pour contourner la limite de taille de tableau de 2 Go

1
Paul Creasey

Sur une machine x64, en utilisant .Net Framework 4 (pas le profil du client), en compilant pour Tout processeur en mode Release, je pouvais gruger toute la mémoire disponible. Mon processus est maintenant de 5,3 Go et j'ai utilisé toute la mémoire disponible (8 Go) sur mon PC. C'est en fait un serveur 2008 R2 x64.
J'ai utilisé une classe Collection personnalisée basée sur CollectionBase pour stocker 61 910 847 instances de la classe suivante:

public class AbbreviatedForDrawRecord {
    public int DrawId { get; set; }
    public long Member_Id { get; set; }
    public string FactorySerial { get; set; }

    public AbbreviatedForDrawRecord() {

    }

    public AbbreviatedForDrawRecord(int drawId, long memberId, string factorySerial) {
        this.DrawId = drawId;
        this.Member_Id = memberId;
        this.FactorySerial = factorySerial;
    }
}
1
Achilles

La liste se développera de manière dynamique pour accueillir autant d'éléments que vous souhaitez inclure, jusqu'à ce que vous dépassez la mémoire disponible!

De la documentation MSDN: 

Si Count est déjà égal à Capacity, la capacité de la liste est augmentée en réaffectant automatiquement le tableau interne et les éléments existants sont copiés dans le nouveau tableau avant l'ajout de celui-ci.

Si Count est inférieur à Capacity, cette méthode est une opération O(1). Si la capacité doit être augmentée pour accueillir le nouvel élément, cette méthode devient une opération O(n), où n est le nombre.

0
Sapph

La liste est limitée à 2,1 milliards d'objets ou à la taille de votre mémoire, quelle que soit la première cible.

0
Blounty

L'interface définit Count et IndexOf, etc., comme type int. Je suppose donc que int.MaxValue ou 2 147 483 647 est le plus grand nombre d'éléments que vous pouvez coller dans une liste.

Vraiment obligé de se demander pourquoi, sur terre, vous en auriez besoin, il y aura probablement une approche plus raisonnable de la gestion des données.

0
Paolo