PowerShell потребляет ГБ оперативной памяти при возврате большого байтового массива? - PullRequest
0 голосов
/ 17 сентября 2018

У меня возникли проблемы с пониманием того, что происходит и почему это происходит.У меня есть небольшая функция, которая захватывает все байты большого файла изображения PNG размером 133 МБ, сохраняет его в байтовом массиве и возвращает его.Есть ли какое-то поведение, которого я не понимаю, или, возможно, ошибка в 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

Я ожидаю, что функция вернет [Byte[]] размером около 133 МБ, но это не так.Вместо этого PowerShell использует около 5 ГБ ОЗУ, распечатывает сообщение об ошибке ниже и возвращает [System.Object[]].

Type: byte[]
Size: 140151164
Array dimensions exceeded supported range.
At F:\test.ps1:10 char:10
+   return $ByteArray
+          ~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (:) [], OutOfMemoryException
    + FullyQualifiedErrorId : System.OutOfMemoryException

Type: System.Object[]
Size: 134217728
Press Enter to continue...:

Что я не понимаю?Почему байтовый массив преобразуется в объект?Почему съедает почти всю мою оперативную память?

1 Ответ

0 голосов
/ 17 сентября 2018

PetSerAl является правильным (как всегда), но, возможно, немного больше объяснений в порядке. При возврате массива из функции PowerShell развертывает этот массив и возвращает вызывающему элемент отдельные элементы. Там они собраны в обычный массив (System.Object[]).

Чтобы предотвратить это, вам нужно обернуть результат массива в другой массив при его возврате. PowerShell будет только развертывать внешний массив и передавать вложенный массив вызывающей стороне как отдельный элемент, сохраняя тип. Думайте об этом как о применении своего рода «транспортного кодирования». Для этого используйте оператор построения унарного массива (,):

return ,$ByteArray
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...