【发布时间】:2019-01-09 12:23:18
【问题描述】:
所以我有一个脚本,它获取 CSV 列表中包含的歌曲的文件名并检查目录以查看文件是否存在,然后导出丢失的信息(如果有)。 CSV 文件如下所示:
现在,当我在较小的目录上测试时,我的脚本似乎可以工作,但是当我针对外部驱动器上包含的实际目录(大约 10TB 的文件)运行它时,我在脚本之前收到“system.outofmemoryexception”错误可以完成。
$myPath = 'Z:\Music\media'
$myCSV = 'C:\Users\Me\Documents\Test.csv'
$CSVexport = 'C:\Users\Me\Documents\Results.csv'
$FileList = Get-ChildItem $myPath -Recurse *.wav | Select-Object -ExpandProperty Name -Unique
Import-CSV -Path $myCSV |
Where-Object {$FileList -notcontains $_.Filename} |
Select ID, AlbumTitle, TrackNo, Filename | Export-CSV $CSVexport -NoTypeInformation
$missing = Import-CSV $CSVexport | Select-Object -ExpandProperty Filename
If(!([string]::IsNullOrEmpty($missing))){
Write-Output "Missing files:`n" $missing}
有没有办法让这个脚本消耗更少的内存或更有效的方法来处理大型文件目录?我是 Powershell 脚本的新手,无法找到解决此问题的方法。
【问题讨论】:
-
如果您逐行运行,您是否在
Get-ChildItem或Import-CSV出现内存不足异常? -
10TB 的文件?!当然当然内存不足了!特别是考虑到您正在递归地尝试首先将所有内容加载到内存中。
-
@HAL9256 异常发生在 get-childitem
-
@TheIncorrigible1 有没有办法读取文件而无需将它们加载到内存中?
-
@jl93 迭代地,而不是递归地。让问题变小
标签: powershell csv out-of-memory powershell-2.0 large-data-volumes