【问题标题】:PowerShell consumes GB of RAM when returning large byte array?返回大字节数组时,PowerShell 消耗 GB 的 RAM?
【发布时间】:2018-09-17 05:13:54
【问题描述】:

我很难理解到底发生了什么以及为什么会发生。我有一个小函数,它抓取一个 133MB 大的 PNG 图像文件的所有字节,将其存储在一个字节数组中,然后返回它。要么有一些我不理解的行为,要么可能是 PowerShell 中的错误?

$TestFile = 'C:\test.png'

function GetByteArray($InputFile) {
    $ByteArray = [IO.File]::ReadAllBytes($InputFile)

    Write-Host ( 'Type: ' + $ByteArray.GetType() )
    Write-Host ( 'Size: ' + $ByteArray.Length )

    return $ByteArray
}
$NewArray = GetByteArray -InputFile $TestFile

Write-Host ( 'Type: ' + $NewArray.GetType() )
Write-Host ( 'Size: ' + $NewArray.Length )

pause

我希望该函数返回一个大小约为 133MB 的 [Byte[]],但事实并非如此。相反,PowerShell 消耗大约 5GB RAM,打印出下面的错误消息,并返回 [System.Object[]]

类型:字节[] 尺寸:140151164 阵列尺寸超出了支持的范围。 在 F:\test.ps1:10 char:10 + 返回 $ByteArray + ~~~~~~~~~~ + CategoryInfo : OperationStopped: (:) [], OutOfMemoryException + FullyQualifiedErrorId : System.OutOfMemoryException 类型:System.Object[] 尺寸:134217728 按 Enter 继续...:

我不明白什么?为什么字节数组被转换为对象?为什么我的内存几乎都吃光了?

【问题讨论】:

  • 您返回的不是字节数组,而是单个字节。

标签: powershell


【解决方案1】:

PetSerAl 是正确的(一如既往),但也许需要更多解释。从函数返回数组时,PowerShell 展开该数组并将各个元素返回给调用者。在那里,它们被聚集成一个常规数组 (System.Object[])。

为防止这种情况,您需要在返回时将数组结果包装在另一个数组中。 PowerShell 只会展开外部数组并将嵌套数组作为单个元素传递给调用方,从而保留类型。将其视为应用一种“传输编码”。使用一元数组构造运算符 (,) 来做到这一点:

return ,$ByteArray

【讨论】:

  • 非常感谢,这确实正确地返回了字节数组!
猜你喜欢
  • 1970-01-01
  • 2015-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多