Как показано в приведенном ниже коде, я создаю новый PSObject для каждого сайта в коллекции сайтов. В конце концов мне нужно запустить это для нескольких веб-приложений SharePoint, каждая из которых содержит несколько сайтов, а общие сайты пересекают 2000. Таким образом, создается много создаваемых PSObjects.Как избавиться от PSObject
PSObject не имеет функции удаления, поэтому каковы мои возможности сделать код более эффективным и удалять объект.
Также каждый раз, когда я выполняю операцию $SiteInfoCollection += $object
, происходит перераспределение памяти, так как это динамически расширяющийся массив. Согласно некоторой статье, которую я прочитал несколько месяцев назад, любая операция перераспределения памяти является дорогостоящей и неэффективной для производительности. Есть ли способ сделать этот шаг эффективным?
$SPWebApp = Get-SPWebApplication "http://portal.contoso.com"
$SiteInfoCollection = @()
foreach($site in $SPWebApp.sites)
{
$object = New-Object PSObject
Add-Member -InputObject $object -MemberType NoteProperty -Name URL -Value ""
Add-Member -InputObject $object -MemberType NoteProperty -Name Title -Value ""
Add-Member -InputObject $object -MemberType NoteProperty -Name Template -Value ""
$object.url = $site.url
$object.title = $site.rootweb.title
$object.template = $site.rootweb.WebTemplate
$SiteInfoCollection += $object
#$object.Dispose() #NOT valid operation
}
$site.Dispose()
}
$SiteInfoCollection
'Get-SPSite' возвращает коллекцию отдельных объектов' Microsoft.SharePoint.SPSite'. '$ SPWebApp.Sites' возвращает' Microsoft.SharePoint.Administration.SPSiteCollection', который, я думаю, не настолько интенсивный, как первый. Цикл foreach создает только один объект SPSite, который используется для получения свойств для каждого SPSite в коллекции. Вот почему я вызываю Dispose вне цикла foreach. Однако это мое настоящее понимание, и я могу ошибаться. Также до сих пор я использовал Start and Stop SPAssignment в начале и конце моих сценариев. Моя цель - сделать мои скрипты более эффективными. – Ron
Вы упомянули о том, что PSObject не является «тяжелым» объектом, подобным объекту SharePoint, который сейчас имеет смысл. Но означает ли это, что нам не всегда нужно «уничтожать» все созданные объекты? Как системный администратор, я не совсем понимаю эти понятия программирования. – Ron
@Ron powershell автоматически избавляется от всех созданных объектов, как только закрывается пробел. – Paul