" OutOfMemoryException异常"使用带有60Gb文件的Compress-Archive时

时间:2017-04-25 16:18:52

标签: powershell powershell-v5.0

我尝试使用Compress-Archive压缩IIS日志文件(总共60GB),但是我收到错误:

  

"类型的异常' System.OutOfMemoryException'被扔了。"

$exclude = Get-ChildItem -Path . | Sort-Object -Descending | Select-Object -First 1
$ArchiveContents = Get-ChildItem -Path . -Exclude $exclude | Sort-Object -Descending
Compress-Archive -Path $ArchiveContents -DestinationPath .\W3SVC2.zip -Force

我已将MaxMemoryPerShellMB调整为2048MB并重新启动了WinRM服务。

执行命令时RAM内存消耗超过6GB。

2 个答案:

答案 0 :(得分:2)

根据Matt的建议,我建议将其存档到文件集中。类似的东西:

For($i=0;$i -le $ArchiveContents.Count;$i=$i+10){
    Compress-Archive -Path $ArchiveContents[$i..($i+9)] -DestinationPath .\W3SVC2-$i.zip -Force
}

这样你一次只能处理10个文件。您可能需要调整文件数量,具体取决于您拥有的文件数量以及它们的大小,即:如果您有300个文件,每个200MB,那么一次10个可能是好的,而如果您有30个文件,则为20MB每个你可能想要增加到50甚至100。

编辑:我只是看了,Compress-Archive支持通过指定-Update参数将文件添加到存档。您应该能够执行与上面相同的操作,稍加修改,以制作1个大型存档。

For($i=0;$i -le $ArchiveContents.Count;$i=$i+10){
    Compress-Archive -Path $ArchiveContents[$i..($i+9)] -DestinationPath .\W3SVC2.zip -Update
}

这应该一次只添加10个文件到目标存档,而不是尝试一次添加所有文件。

答案 1 :(得分:0)

以下解决方案提供比压缩-存档

更好的增强性能

创建 OptimalCompression.ps1

Create Windows Optimized Compression
ECHO OFF
ECHO Starting Compressing $args[0] to $args[1]
$source = $args[0]
$destination = $args[1]
$compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal
$includeBaseDirectory = $false
Add-Type -AssemblyName System.IO.Compression.FileSystem
[System.IO.Compression.ZipFile]::CreateFromDirectory("$sourcePath","$destinationPath",$compressionLevel,$includeBaseDirectory)
PAUSE

使用所需参数运行命令

C:\> powershell .\OptimalCompress.ps1 c:\YourSourceFolder c:\YourDestinationFile.zip