2009-04-23 9 views

Répondre

2

semble excessive. N'atteindriez-vous pas d'abord la limite de mémoire de la machine, en fonction de la taille des objets de votre liste? (Je suppose que cette vérification est effectuée par l'utilisateur de la classe List, et n'est pas une vérification dans la mise en œuvre?)

Peut-être est-il rassurant de voir que les collègues pensent à l'avenir? (sarcasme!)

1

Il semblerait ainsi, et je probablement ne comprendrait pas le contrôle mais je suis en conflit là-dessus. Programmeurs une fois que 2 chiffres étaient suffisants pour représenter l'année dans les champs de date en raison du fait que c'était bien pour la durée de vie prévue de leur code, mais nous avons découvert que cette hypothèse n'était pas correcte.

Examinez le risque, regardez l'effort et portez un jugement (aussi connu sous le nom de supposition éclairée :-)). Je ne dirais pas qu'il y a une règle absolue sur ce sujet.

0

Comme dans la réponse ci-dessus il y aurait plus de choses qui ne vont pas, je soupçonne que de s'inquiéter à ce sujet. Mais oui si vous avez le temps et l'envie de pouvoir polir le code jusqu'à ce qu'il brille!

0

vrai

(bien que vous a demandé vrai ou faux ..)

4

1. limites de la mémoire

Eh bien, la taille de System.Object sans propriétés est 8 octets (2x32 pointeurs de bits), ou 16 octets dans un système 64 bits. [EDIT:] En fait, je viens de vérifier dans WinDbg, et la taille est de 12 octets sur x86 (32 bits). Ainsi, dans un système 32 bits, vous auriez besoin d'un RAM de 24 Go (que vous ne pouvez pas avoir sur un système 32 bits).

2. La conception du programme

Je crois fermement qu'une telle grande liste ne devrait pas être tenue en mémoire, mais plutôt dans un autre support de stockage. Mais dans ce cas, vous aurez toujours la possibilité de créer une classe en cache envelopper une liste, qui gérerait le stockage réel sous le capot. Donc tester la taille avant d'ajouter est le mauvais endroit pour faire le test, votre implémentation de List devrait le faire elle-même si vous le jugez nécessaire un jour.

3. Pour être du bon côté

Pourquoi ne pas ajouter un compteur rentrée à l'intérieur de chaque méthode pour éviter un débordement de la pile? :)

Alors, oui, c'est fou de tester pour ça. :)

0

Juste essayé ce code:

List<int> list = new List<int>(); 
while (true) list.Add(1); 

Je suis un System.OutOfMemoryException. Alors que feriez-vous pour vérifier/gérer cela?

+0

Vous observez OutOfMemoryException. Les MOO peuvent généralement être manipulés et l'opération réessayée dans une minute ou à. Par exemple. deux threads séparés demandent beaucoup de mémoire, seulement 1 l'obtient. Essayez la seconde plus tard. Peut parfois se produire si votre application effectue une manipulation PDF ou image en mémoire. – Precipitous

0

Si vous continuez à ajouter des éléments à la liste, vous manquez de mémoire à long avant de toucher cette limite. Par "long" je veux dire vraiment "beaucoup plus tôt que vous ne le pensez".

Voir this discussion sur le tas d'objets volumineux (LOB). Une fois que vous avez atteint environ 21500 éléments (la moitié d'un système 64 bits) (en supposant que vous stockiez des références d'objet), votre liste commencera à être un objet volumineux. Puisque le LOB n'est pas compacté de la même manière que les tas normaux .NET, vous finirez par le fragmenter suffisamment pour qu'une zone de mémoire continue assez grande ne puisse pas être allouée.

Vous ne devez pas vérifier cette limite du tout, ce n'est pas une limite réelle.

0

Oui, c'est crazyness.

Tenir compte ce qui se passe dans le reste du code lorsque vous commencez à atteindre ces chiffres. L'application est-elle même utilisable si vous aviez des millions d'éléments dans la liste?

S'il est même possible que l'application atteindrait cette quantité de données, peut-être vous devriez plutôt prendre des mesures pour garder la liste d'obtenir que les grandes. Peut-être que vous ne devriez même pas garder toutes les données en mémoire à la fois. Je ne peux pas vraiment imaginer un scénario où n'importe quel code pourrait utiliser pratiquement autant de données.

Questions connexes