【发布时间】:2022-10-25 12:04:51
【问题描述】:
我编写了一个脚本来帮助我识别重复文件。出于某种原因,如果我拆分这些命令并将其导出/导入到 CSV,它的运行速度要比将所有内容都留在内存中要快得多。这是我的原始代码,速度太慢了:
Get-ChildItem M:\ -recurse | where-object {$_.length -gt 524288000} | select-object Directory, Name | Group-Object directory | ?{$_.count -gt 1} | %{$_.Group} | export-csv -notypeinformation M:\Misc\Scripts\Duplicates.csv
如果我把它分成 2 个命令并在中间导出到 CSV,它的运行速度大约快 100 倍。我希望有人可以阐明我做错了什么。
Get-ChildItem M:\ -recurse | where-object {$_.length -gt 524288000} | select-object Directory, Name | Export-Csv -notypeinformation M:\Misc\Scripts\DuplicateMovies\4.csv
import-csv M:\Misc\Scripts\Duplicates\4.csv | Group-Object directory | ?{$_.count -gt 1} | %{$_.Group} | export-csv -notypeinformation M:\Misc\Scripts\Duplicates\Duplicates.csv
remove-item M:\Misc\Scripts\Duplicates\4.csv
感谢任何建议,
~TJ
【问题讨论】:
-
我很难相信导出到文件然后再导入过滤比只在内存中执行所有操作更快。而且,
select-object Directory, Name定位错误,应该是导出前的最后一步。 -
我很早就做了选择,因为我希望在脚本的早期删除一些其他属性会加快速度——例如,我不关心 LastWriteTime。我刚才把 select-object 放在最后,但没有发现任何区别。父文件夹有大约 10K 子文件夹,特别是脚本的组对象部分需要永远 - 我在等待 20 分钟后放弃了,而当我使用 CSV 文件时,组对象需要 10 秒。
-
这是 PowerShell 5.1 还是 PowerShell Core 7+?另外,您应该注意,
.Directory不仅仅是一个字符串,它本身就是一个DirectoryInfo对象,如果您尝试使用太多文件进行此操作,那么它是巨大的(在您的Get-ChildItem调用中也缺少-File)。此外,您确定文件是否重复的条件似乎很奇怪,按父文件夹对对象进行分组如何帮助您确定它们是否重复? -
确定文件是否重复的最佳方法是对它们进行 MD5sum,或者更麻烦但更快,顺序读取字节并比较它们