使用Powershell v3,我使用.net库类System.DirectoryServices.DirectoryEntry
和System.DirectoryServices.DirectorySearcher
来查询域中用户的属性列表。这个代码基本上是found here。
您需要添加的唯一内容是行$ds.PageSize=1000
和$ds.Filter = '(&(objectCategory=person)(objectClass=user))'
之间的行$ds.PropertiesToLoad.AddRange($properties)
。这将取消仅吸引1000名用户的限制。
来自一个域的用户数量(我们称之为domain1
)我有超过80,000个用户。另一个域名(我们称之为domain2
)拥有超过200,000个用户。
如果我在domain1
上运行代码,大约需要12分钟(与Get-QADUser
正在服用的24小时相比,这是非常棒的)。但是,在PowerShell窗口中完成脚本后,我注意到内存耗尽约500mb。 Domain2
会留下大约1.5gb
的记忆力。
注意: Get-QADUser
的内存泄漏远远超过更糟糕。 Domain2
留下大约6gb的记忆力,大约需要72小时才能完成(与.net类相比不到一小时)。
释放内存的唯一方法是关闭PowerShell窗口。但是,如果我想编写一个脚本来调用所有这些域脚本来一个接一个地运行它们呢?到达第6个剧本后,我的内存会耗尽。
我唯一能想到的是New-Object
正在创建一个构造函数,并且没有析构函数(与java不同)。我在循环迭代期间尝试使用[System.GC]::Collect()
,但这没有任何影响。
有原因吗?它是可以解决的还是我坚持这个?
答案 0 :(得分:1)
有一点需要注意:如果确实存在内存泄漏,您可以在新shell中运行脚本:
powershell { <# your code here #> }
对于泄漏,只要您有任何引用大型数据的对象的变量就无法收集。您可以通过使用内存分析器来查看仍在内存中的内容以及原因。据我所知,如果你在脚本文件中使用该代码并执行脚本(使用&
而不是.
!),那么这不应该真的发生。
答案 1 :(得分:0)
我猜它正在使用所有内存$table
。为什么不将收集的数据直接写入文件,而不是将其添加到数组中?