Вы собираетесь потратить много времени ЦП, перераспределяя внутренние «массивы» в Hashtable.Вы пробовали .NET конструктор для Hashtable, который занимает емкость ?
$t = New-Object Hashtable 20000
...
if (!($t.ContainsKey($emailString))) {
$t.Add($emailString, $emailString)
}
Моя версия использует ту же самую $ emailString для ключа и значения, нет .NET-бокса $ true для[объект] просто как заполнитель.В условных выражениях PowerShell непустая строка будет иметь значение $ true, поэтому другой код, который вы проверяете, не должен меняться.Использование «+ = @ {...}» было бы большим нет-нет в чувствительном к производительности .NET-коде.Возможно, вы выделяете новый Hashtable для каждого электронного письма, просто используя синтаксис '@ {}', который может тратить много времени.
Ваш подход разбить очень большую коллекцию на (относительно небольшую)Количество небольших коллекций называется «шардинг».Вам следует использовать конструктор Hashtable, который занимает всю емкость, даже если вы разделяете на 16.
Кроме того, @Larold прав, если вы не просматриваете адреса электронной почты, тогда используйте 'New-Object ArrayList20000 ', чтобы создать предварительно выделенный список.
Кроме того, коллекции растут по затратам (в 1,5 или 2 раза при каждом «росте»).Результатом этого является то, что вы должны быть в состоянии уменьшить, сколько вы предварительно выделяете на порядок, и если коллекции меняются один или два раза за «загрузку данных», вы, вероятно, не заметите.Держу пари, что это первые 10-20 поколений «роста», которые требуют времени.