IndexOutOfRangeException при добавлении в Hashset <T> - PullRequest
19 голосов
/ 29 ноября 2010

У меня есть простое приложение, которое добавляет около 7 миллионов коротких строк в HashSet <string>. Иногда я получаю исключение во время вызова Hashset.Add (): System.Collections.Generic.HashSet`1.IncreaseCapacity (): индекс был за пределами массива.

Это периодически возникающая проблема, которая, похоже, связана с памятью, но это на сервере win2k8 R2 с 16 ГБ, больше ничего не происходит, большая часть этой физической памяти доступна. Есть идеи?

Ответы [ 2 ]

39 голосов
/ 29 ноября 2010

HashSet<T> не является поточно-ориентированным. Особенно при добавлении элементов в многопоточном сценарии, когда необходимо увеличить внутреннюю емкость, все может быть не синхронизировано.

5 голосов
/ 29 ноября 2010

Методы экземпляра на HashSet<T> не являются поточно-ориентированными.В частности, когда вы пытаетесь добавить элемент, который заставил бы набор превышать границы существующего массива более чем в одном потоке за раз, переменные экземпляра использовались для отслеживания размера набора и последнего индекса внабор может быть обновлен в обоих потоках.В частности, если последнее значение индекса обновляется вторым потоком (с большим значением) до того, как первый поток завершит копирование массива назначения, он может попытаться получить доступ к элементу локального массива, который не существует, поскольку локальный массивбыло выделено только для хранения в два раза меньше элементов, чем для второго потока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...