使用PowerShell压缩文件会抛出OutOfMemory异常

时间:2016-10-06 14:33:13

标签: powershell zip compression out-of-memory

我正在使用PowerShell v5并尝试使用Microsoft.PowerShell.Archive模块中的someMethod cmdlet存档该文件:

Compress-Archive

这可以完美地处理3个文件,其大小如下:Compress-Archive -LiteralPath $GLBSourcePathFull -CompressionLevel Optimal -DestinationPath $GLBArchiveFile 16MB341MB

但是,一旦遇到大于345MB(大约)的文件,PowerShell就会抛出以下异常:

600MB

同样的事情发生在大小超过Exception calling "Write" with "3" argument(s): "Exception of type 'System.OutOfMemoryException' was thrown." 的文件中。

要为我的情况添加更多上下文,我正在尝试将文件从本地文件夹压缩到我公司内的一个网络位置,但是我怀疑是否存在差异,因为我在本地PC上测试了这个得到相同的结果。

你以前遇到过这种情况吗?在输出zip而不是直接写入磁盘之前是否尝试将整个文件读入内存?或者,默认情况下PowerShell可以使用多少内存?

我知道还有其他一些解决方案,比如1GB模块,但此时我不允许使用任何开源软件,因此我想了解我目前的情况以及我可能如何解决此

感谢您提出任何意见。

1 个答案:

答案 0 :(得分:0)

Compress-Archive cmdlet可能使用一种简单的方法将整个源文件和目标存档加载/映射到内存中,因为您显然使用32位PowerShell这些文件(以及PowerShell进程代码和其他数据)过程使用的)不适合2GB的进程地址空间(如果是LARGEADDRESSAWARE则为3-4GB)。

具有大量RAM(例如32GB)的计算机上的64位PowerShell成功压缩1GB +文件。

如果您坚持使用32位PowerShell和内置cmdlet,请尝试将文件拆分为100MB文件,并使用一些描述性文件名,以便能够在解压缩脚本中加入它们。显然,对于没有重新组装脚本的人来说,这样的存档将无法使用。