如下面的代码所示,我最终为站点集合中的每个站点创建了一个新的PSObject。最后,我需要为多个SharePoint web应用程序运行这个程序,每个应用程序包含几个站点,总站点跨越2000年。因此,这是大量正在创建的PSObjects。
PSObject没有dispose函数,所以我有哪些选项可以提高代码的效率和释放对象。
而且,每次执行$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发布于 2014-10-19 07:51:59
当时间到了,这个对象将被垃圾收集。它不是一个包含COM &的沉重的SharePoint对象,并且不需要在那里进行处理。
希望能够释放$site,因此将其放入foreach循环中。
对于大多数SharePoint PowerShell命令,您可以使用-AssignmentCollections而不是手动处理:
为了妥善处理而管理对象。使用对象(如SPWeb或SPSite )可以使用大量内存,而在脚本中使用这些对象需要适当的内存管理。使用SPAssignment对象,您可以将对象分配给变量,并在需要这些对象释放内存后将其释放。当使用SPWeb、SPSite或SPSiteAdministration对象时,如果不使用赋值集合或全局参数,则会自动释放这些对象。
获得相同功能的更多PowerShell方法是
$gc = Start-SPAssignment
Get-SPSite "http://portal.contoso.com" -Limit All -AssignmentCollection $gc | % {
# Loop
}
Stop-SPAssignment -Identity $gchttps://stackoverflow.com/questions/26448498
复制相似问题