2014-10-19 4 views
0

Как показано в приведенном ниже коде, я создаю новый 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 

ответ

0

Этот объект будет собираться мусором, когда придет время. Это не тяжелый объект SharePoint, содержащий COM & Соединения с базой данных, и там нет необходимости в удалении.

хочу удалять $ site так, чтобы он помещался внутри цикла foreach.

Для большинства команд SharePoint PowerShell можно использовать -AssignmentCollections вместо вручную утилизации:

Управляет объектами с целью надлежащей утилизации. Использование объектов, таких как SPWeb или SPSite, может использовать большие объемы памяти, и использование этих объектов в сценариях Windows PowerShell требует правильного управления памятью. Используя объект SPAssignment, вы можете назначать объекты переменной и удалять объекты после того, как они необходимы для освобождения памяти. Когда используются объекты SPWeb, SPSite или SPSiteAdministration, объекты автоматически удаляются, если коллекция присвоений или глобальный параметр не используются.

Более PowerShell способа получить такую ​​функциональность будет

$gc = Start-SPAssignment 
Get-SPSite "http://portal.contoso.com" -Limit All -AssignmentCollection $gc | % { 
    # Loop 
} 
Stop-SPAssignment -Identity $gc 
+0

'Get-SPSite' возвращает коллекцию отдельных объектов' Microsoft.SharePoint.SPSite'. '$ SPWebApp.Sites' возвращает' Microsoft.SharePoint.Administration.SPSiteCollection', который, я думаю, не настолько интенсивный, как первый. Цикл foreach создает только один объект SPSite, который используется для получения свойств для каждого SPSite в коллекции. Вот почему я вызываю Dispose вне цикла foreach. Однако это мое настоящее понимание, и я могу ошибаться. Также до сих пор я использовал Start and Stop SPAssignment в начале и конце моих сценариев. Моя цель - сделать мои скрипты более эффективными. – Ron

+0

Вы упомянули о том, что PSObject не является «тяжелым» объектом, подобным объекту SharePoint, который сейчас имеет смысл. Но означает ли это, что нам не всегда нужно «уничтожать» все созданные объекты? Как системный администратор, я не совсем понимаю эти понятия программирования. – Ron

+0

@Ron powershell автоматически избавляется от всех созданных объектов, как только закрывается пробел. – Paul

Смежные вопросы