【发布时间】:2019-07-07 18:34:37
【问题描述】:
我正在尝试下载一个 10MB 的文件并将其存储为数组以供进一步处理。
直接调用(New-Object System.Net.WebClient).DownloadData("<url>") 时一切正常。但是如果我将它包装在一个函数中并将调用结果返回到WebClient::DownloadData,内存占用会增加到大约 500mb。
我使用的函数:
function My-Download {
param (
[Parameter(Mandatory = $True, Position = 1)] [String] $UrlCode
)
(New-Object System.Net.WebClient).DownloadData($UrlCode)
}
$x = My-Download("https://file-examples.com/wp-content/uploads/2017/04/file_example_MP4_1280_10MG.mp4")
我将它包装在函数中的原因是我还在返回数据之前对数据进行了额外的处理,但即使是这个小例子也说明了问题。
调用 $x = (New-Object System.Net.WebClient).DownloadData("https://file-examples.com/wp-content/uploads/2017/04/file_example_MP4_1280_10MG.mp4") 会产生 83MB:
调用上述函数结果为500MB:
如此高的内存使用率是什么原因,我可以做些什么来优化它?
Powershell 版本:
Major Minor Build Revision
----- ----- ----- --------
5 1 17134 407
【问题讨论】:
-
调用函数时不要使用方括号。相反,请使用单个空格字符。
$x = My-Download "https://..."。此外,参数位置的第一个索引是 0,而不是 1。 -
这似乎不能解决问题。
-
(New-Object System.Net.WebClient).DownloadData($UrlCode)->,(New-Object System.Net.WebClient).DownloadData($UrlCode) -
非常感谢,成功了!逗号是什么意思,没有逗号会发生什么?
-
@hurlenko - 该位置的逗号运算符将数组包裹在右侧的项目周围。这会导致 PoSh 的“展开集合”功能展开 outer 集合,而不展开内部集合。显然,将集合分成几部分以传递是内存使用的来源。 ///// 我什至不想去研究那个... [grin]
标签: powershell