gpt4 book ai didi

powershell - 计算DFS文件夹暂存大小的前32个文件大小的更好方法

转载 作者:行者123 更新时间:2023-12-02 23:24:35 26 4
gpt4 key购买 nike

设置DFS复制副本时的常见任务是确定复制文件夹中32个最大文件的大小-根据当前的最佳做法,这些文件的总和应为暂存区域的最小大小。

Technet博客中提供了一种查找和计算前32个文件大小的方法:https://blogs.technet.microsoft.com/askds/2011/07/13/how-to-determine-the-minimum-staging-area-dfsr-needs-for-a-replicated-folder/

它依赖于使用Get-ChildItem在路径中查找所有文件及其大小,按大小排序,丢弃除32个最大文件外的所有文件,然后计算总和。

当路径中的文件数量有限时,这很好,但是在索引包含数十万甚至数百万个文件的文件夹时,存在严重的缺陷。该过程在执行过程中将所有内容转储到内存中(在我的示例中,该过程消耗了2GB以上的虚拟内存),并且即使单个文件很小,也要花费很长时间。内存将保持分配状态,直到关闭PS实例为止。

PS C:\> measure-command { (get-childitem F:\Folder\with\966693\items -recurse | 
sort-object length -descending | select-object -first 32 |
measure-object -property length -sum).sum }
Days : 0
Hours : 0
Minutes : 6
Seconds : 6
Milliseconds : 641
Ticks : 3666410633
TotalDays : 0.00424353082523148
TotalHours : 0.101844739805556
TotalMinutes : 6.11068438833333
TotalSeconds : 366.6410633
TotalMilliseconds : 366641.0633

最佳答案

如果您可以大大加快Get-ChildItem的速度,我会感到惊讶,除非您可以避免为每个文件构建[IO.FileInfo]对象(也许是.Net DirectorySearcher?)。

但是您可以通过不保留所有结果来减少内存需求,在本示例中仅保留正在进行的N个最大值(例如100),而是调整以测试内存/性能,例如

$BufferSize = 100
$FileSizes = New-Object System.Collections.ArrayList

Get-ChildItem 'd:\downloads' -Force -Recurse -File | ForEach {

$null = $FileSizes.Add($_.Length)
if ($FileSizes.Count -gt $BufferSize)
{
$FileSizes.Sort()
$FileSizes.RemoveRange(0, ($BufferSize-32))
}
}
($FileSizes[0..31] | measure-object -Sum).Sum/1GB

在某些最大的文件被隐藏的情况下,向gci添加了 -Force参数。

关于powershell - 计算DFS文件夹暂存大小的前32个文件大小的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40457784/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com