将文件添加到ZipArchive会导致OutOfMemory异常

时间:2018-09-05 10:36:53

标签: c#

我正在创建以下代码的zip文件

ZipArchive MyZipArchive = System.IO.Compression.ZipFile.Open(@"c:\ZipProject\Test.zip", ZipArchiveMode.Update);

然后我将文件添加到zip中,如下所示。 fielList中大约有10个文件,每个文件大小为250 mb

foreach (string f in fileList)
{ 
     MyZipArchive.CreateEntryFromFile(f,Path.GetFileName(f),CompressionLevel.Fastest );
}

在第一个文件上,我收到OutOfMeomry异常 是否有将大文件添加到zip的方法? 我已经尝试了所有压缩方式,但结果相同

2 个答案:

答案 0 :(得分:1)

使用几个只有几个MB的文件和一个空的zip文件来测试您的代码。 如果失败,则问题不在于内存,而在于编程错误。 如果可行,则实际上您的虚拟内存不足。在这种情况下,您将必须切换到x64才能寻址超过4 GB的内存。那是假设您有足够的物理内存。

答案 1 :(得分:1)

我测试了您的示例(下面是完整代码)

using System;
using System.IO;
using System.IO.Compression;

namespace ZipTest
{
  internal static class Program
  {
    private static void Main()
    {
      var fileList = new[] { @"d:\Test\file1", @"d:\Test\file2", @"d:\Test\file3", @"d:\Test\file4",
        @"d:\Test\file5", @"d:\Test\file6", @"d:\Test\file7", @"d:\Test\file8", @"d:\Test\file9", @"d:\Test\file10" };
      using (var MyZipArchive = ZipFile.Open(@"d:\Test\Test.zip", ZipArchiveMode.Update))
      {
        foreach (var f in fileList)
        {
          Console.WriteLine("Compressing: " + f);
          MyZipArchive.CreateEntryFromFile(f, Path.GetFileName(f), CompressionLevel.Fastest);
        }
      }
    }
  }
}

文件总大小约为2 GB,压缩后的大小几乎相同(我使用了安装程序,因为没有找到其他大文件)。

第一次运行导致内存不足异常(在最后一个文件之后)。这似乎导致Windows清除了(空闲的未使用状态)内存,并且没有其他运行引起异常。该应用程序的总虚拟内存约为3.5 GB

请参阅注释中的重复项。这可能会对您有所帮助。