Распаковка байтового массива Powershell занимает много времени - PullRequest
0 голосов
/ 02 июня 2018

Я передаю 30 МБ сжатого двоичного массива в кодировке UTF-8 этой функции PowerShell.Процесс обработки занимает более 30 минут, и происходит сбой PowerShell без вывода данных.Любой совет, как сделать это быстрее?

function Get-DecompressedByteArray {

    [CmdletBinding()]
    Param (
        [Parameter(Mandatory,ValueFromPipeline,ValueFromPipelineByPropertyName)]
        [byte[]] $byteArray = $(Throw("-byteArray is required"))
    )
    Process {
        Write-Verbose "Get-DecompressedByteArray"
        $input = New-Object System.IO.MemoryStream( , $byteArray )
        $output = New-Object System.IO.MemoryStream
        $gzipStream = New-Object System.IO.Compression.GzipStream $input, ([IO.Compression.CompressionMode]::Decompress)
        $gzipStream.CopyTo( $output )
        $gzipStream.Close()
        $input.Close()
        [byte[]] $byteOutArray = $output.ToArray()
        Write-Output $byteOutArray
    }
}

Вызов функции

$result=Get-DecompressedByteArray -byteArray $res.content

1 Ответ

0 голосов
/ 03 июня 2018

Использование кода C # с Add-Type выполняется до 4 раз быстрее, чем код powershell.Я протестировал здесь файл gzip размером 5 МБ.Возможно, вам следует использовать код C # в вашем скрипте powershell, чтобы повысить производительность.

Add-Type -typedef @"
    using System;
    using System.IO;
    using System.IO.Compression;

    namespace myGzip
    {
        public static class Decompressor
        {
            public static byte[] Decompress(string filePath)
            {
                byte[] data = File.ReadAllBytes(filePath);

                using (MemoryStream compressedStream = new MemoryStream(data))
                {
                    using (GZipStream zipStream = new GZipStream(compressedStream, CompressionMode.Decompress))
                    {
                        using (MemoryStream resultStream = new MemoryStream())
                        {
                            zipStream.CopyTo(resultStream);
                            return resultStream.ToArray();
                        }
                    }
                }
            }
        }
    }

"@

function Get-DecompressedByteArray {

    [CmdletBinding()]
    Param (
        [Parameter(Mandatory,ValueFromPipeline,ValueFromPipelineByPropertyName)]
        [byte[]] $byteArray = $(Throw("-byteArray is required"))
    )
    Process {
        Write-Verbose "Get-DecompressedByteArray"
        $input = New-Object System.IO.MemoryStream( , $byteArray )
        $output = New-Object System.IO.MemoryStream
        $gzipStream = New-Object System.IO.Compression.GzipStream $input, ([IO.Compression.CompressionMode]::Decompress)
        $gzipStream.CopyTo( $output )
        $gzipStream.Close()
        $input.Close()
        [byte[]] $byteOutArray = $output.ToArray()
        Write-Output $byteOutArray
    }
}

# Powershell
(Measure-Command {

    $inBytes  = [System.IO.File]::ReadAllBytes("D:\test.gz");
    $bytes    = Get-DecompressedByteArray -byteArray $inBytes


}).Milliseconds
$bytes.Length

# C#
(Measure-Command {

    $bytes = [myGzip.Decompressor]::Decompress("D:\test.gz")

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