2009-09-25 5 views
0

Si vous travaillez avec une grande liste (disons 1GB), elle doit être redimensionnée pour faire place à d'autres éléments. Est-il possible de lire/écrire dans cette liste alors que est en cours de redimensionnement, ou l'appel va-t-il être bloqué jusqu'à ce que l'opération soit terminée?Travailler avec une grande liste <T>

+1

Vous voulez dire que vous avez 250.000 articles dans la liste (32 bits), ou 125.000 articles dans la liste (64 bits), de types de référence, ou que vous avez X nombre d'articles dans la liste, où X est 1GB/(taille de l'article)? Ou voulez-vous dire que la taille totale de tous les éléments + la liste est de 1 Go? –

Répondre

5

Vous dites "1GB size" mais qu'est-ce que cela signifie réellement? Gardez à l'esprit que si vous travaillez avec un type de référence, tout ce qui sera dans la liste elle-même est un tas de références - donc la majeure partie de la mémoire occupée par "une liste et tous ses éléments" va être dans les éléments eux-mêmes, sauf si vous avez beaucoup de références en double. Maintenant, pour ce qui est de votre question elle-même, List<T> n'est pas threadsafe. Vous ne devriez pas essayer de le lire pendant qu'il est modifié dans un autre thread. Si vous devez travailler avec une liste dans plusieurs threads, avec certains d'entre eux la modifiant, vous devez utiliser le verrouillage pour vous assurer qu'un seul thread y accède à temps (ou peut-être plusieurs threads en train de lire, mais pas d'écrire).

+0

C'est ce que je pensais, mais je voulais m'assurer. Merci :) – Joe

0

Si vous travaillez avec une liste extrêmement volumineuse, je vous recommande fortement de pré-allouer de l'espace avant de l'utiliser afin d'éviter une croissance dynamique. Si vous prévoyez d'utiliser un concert, déterminez une capacité qui gère un peu plus d'un concert et créez la liste avec cette capacité. Cela devrait éliminer le besoin d'expansion et votre problème disparaîtra.

Si vous avez besoin de fonctionnalités simultanées dans vos listes, j'examinerais les extensions parallèles à .NET. Il existe des collections simultanées qui permettent un accès multi-thread. Je ne suis pas sûr qu'ils autorisent un accès simultané lors du redimensionnement, mais cela vaut le coup d'oeil. Les extensions parallèles seront également incluses dans .NET 4.0.