【发布时间】:2019-04-06 05:23:48
【问题描述】:
以下代码从 list.txt 文件中搜索 400 多个数字,以查看它是否存在于指定文件夹路径内的任何文件中。
脚本很慢,运行 25 分钟后仍未完成,因此尚未完成。我们正在搜索的文件夹是 507 MB(532,369,408 字节),其中包含 1,119 个文件和 480 个文件夹。非常感谢任何有助于提高搜索速度和效率的帮助。
$searchWords = (gc 'C:\temp\list.txt') -split ','
$results = @()
Foreach ($sw in $searchWords)
{
$files = gci -path 'C:\Users\david.craven\Dropbox\Asset Tagging\_SJC Warehouse_\_Project Completed_\2018\A*' -filter "*$sw*" -recurse
foreach ($file in $files)
{
$object = New-Object System.Object
$object | Add-Member -Type NoteProperty –Name SearchWord –Value $sw
$object | Add-Member -Type NoteProperty –Name FoundFile –Value $file.FullName
$results += $object
}
}
$results | Export-Csv C:\temp\output.csv -NoTypeInformation
【问题讨论】:
-
您是否要从文件内容中查找
$sw?这个问题听起来像你,但脚本只显示文件名。 -
您完整阅读了所有 1,100 个文件,寻找 400 个单词中的每一个!这种疯狂的语言可以搜索任何一个,一次说 10 个单词吗?那么你只需要 40 次通过 1,100 个文件,它会快 10 倍。如果您找到一个数字,您是否必须继续搜索文档,或者您可以在第一次匹配时退出?这种疯狂的语言是否允许并行化?你能用 Linux 代替这个东西吗?
-
看看Select-String,可以使用正则表达式进行更高效的匹配。此外,首先获取所有文件名然后在内存中检查它们而不是多次调用
Get-ChildItem可能更有效。最后,尝试使用PsCustomObject 方法而不是New-Object/Add-Member,因为管道可能会减慢速度。 -
@MarkSetchell 当然。
select-string是powershell中grep的类似物,它可以搜索多个模式以及正则表达式 -
如果您的项目中有一段工作代码,并且正在寻找以下领域的开放式反馈:最佳实践和设计模式使用、安全问题、*性能*、正确性意料之外的情况 - 那么Code Review SE 是提问的正确地方。有人可以移动这个问题吗?我做不到。
标签: performance powershell coding-efficiency